Diagnosing Empty Bibliographies and Undefined Citations in biblatex with biber
When biblatex citations render as [?] despite a correct .bib file, the fault usually lies in the build pipeline or auxiliary files rather than the source data. This guide walks through the checks and fixes.
01 Jun 2026, 18:27 UTC

Recognizable condition
Your document compiles, but every \cite command renders as [?] and the bibliography section is empty or missing. The .bib file contains the entries, and the preamble loads biblatex with backend=biber. The .log file contains warnings such as Citation undefined or There were undefined references. The problem persists across recompiles and is not resolved by a single additional pdflatex run.
This pattern indicates that the bibliography data never reached the final document. biblatex separates formatting from data processing: it writes an intermediate .bcf file, an external tool called biber reads that file and the .bib database, then produces a .bbl file that pdflatex typesets. If any link in that chain is missing or stale, citations remain undefined.
Cause and diagnostic table
| Symptom | Likely cause | Diagnostic signal |
|---|---|---|
Build log shows Running bibtex instead of Running biber | Backend mismatch: preamble requests biber, but the build recipe invokes bibtex | Editor or Makefile external tool configuration |
No .bbl file, or .bbl older than .bib | Missing biber step in the compilation chain | File timestamps in project directory |
| Switched backends or keys recently, but output unchanged | Stale auxiliary files (.aux, .bbl, .bcf, .run.xml) | Auxiliary file timestamps and content |
biber runs, but specific citations still undefined | Encoding mismatch or \cite key does not exactly match .bib entry key | .log warnings after biber; text comparison of keys |
| Package option clash or legacy bibliography errors | natbib loaded alongside biblatex | Preamble package list |
Ordered checks
- Inspect the preamble. Confirm
\usepackage[backend=biber]{biblatex}is present and that\usepackage{natbib}does not appear.biblatexis not compatible withnatbibin the same document. - Check the build log. Search for
Running biber. If the log showsRunning bibtex, or showsI found no \citation commands, the external tool is wrong or was invoked beforepdflatexgenerated citation data. - Verify auxiliary files. Confirm a
.bblfile exists and is newer than both the.bibsource and the.bcffile. A validbiberrun produces a.bblcontaining\entrycommands. - Compare keys and encoding. Open the
.bibfile in a UTF-8 capable editor. Search for each\citekey in your source and confirm an exact, case-sensitive match in the.bibfile. Invisible characters or encoding mismatches causebiberto skip entries.
Fixes tied to findings
Backend mismatch
If the build invokes bibtex while the preamble requests backend=biber, update the build recipe. In a terminal, replace the bibtex call with biber. In an editor such as TeXstudio or VS Code with LaTeX Workshop, change the external tool or build recipe from bibtex to biber; editor recipes are often cached and do not update automatically when the preamble changes.
Missing biber step
If biber never ran, execute the full sequence from the project directory. You need write permission to the directory to create auxiliary files.
cd /path/to/project
pdflatex main
biber main
pdflatex main
pdflatex main
Replace main with your job name (the filename without .tex). The first pdflatex run writes the .bcf file and citation keys. biber reads that file and the .bib database, then writes the .bbl file. The final two pdflatex runs resolve citations and stabilize page numbers and cross-references.
Expected check: after biber, the .bbl file should exist and contain \entry blocks. The .log from the final pdflatex run should no longer contain Citation undefined warnings.
Risk: if you delete auxiliary files to force a clean rebuild, cross-reference positions and page numbers are temporarily lost until the final pdflatex run completes.
Stale auxiliary files
If you recently switched from bibtex to biber, or changed citation keys, delete the auxiliary files and rebuild:
rm main.aux main.bbl main.bcf main.run.xml
pdflatex main
biber main
pdflatex main
pdflatex main
This removes artifacts from the old backend, including the .aux file that stores labels and cross-reference data. Expect the same two-pass pdflatex requirement after biber.
Encoding or key mismatch
If biber runs but specific citations remain undefined, save the .bib file as UTF-8. If you compile with pdflatex, ensure the preamble includes \usepackage[utf8]{inputenc} (or the equivalent for your distribution). With lualatex or xelatex, UTF-8 is native. Compare each \cite key against the .bib entry key using a plain-text search; keys are case-sensitive and must match exactly.
Package conflict
If natbib is loaded, remove it and replace legacy commands such as \citep with biblatex equivalents such as \parencite. Rebuild cleanly.
Escalation criteria
Escalate the problem when citations remain undefined after you have confirmed the correct backend, performed a clean rebuild, and verified that keys match exactly. At that point, create a minimal working example (MWE): a short document with one \cite command, one .bib entry, and the same preamble options. If biber reports fatal parse errors, duplicate keys, or package clashes that prevent .bbl generation, the .bib syntax may be corrupted or the installed biblatex and biber versions may be incompatible.
Limitations and verification
Behavior is version-sensitive. Older TeX distributions may ship incompatible biblatex and biber pairs, and default backend assumptions vary across distributions. Always verify against your local installation.
To check the result, search the final .log for undefined citation warnings; their absence is the primary success signal. Look for Package biblatex Info messages confirming that biber processed the bibliography. Confirm the .bbl timestamp is newer than the .bib file. Finally, compare the citation keys in your source against the .bib entries one more time; a single invisible character or case difference explains many persistent failures.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.