[Bug 293859] C11's call_once requires nonstandard library -lstdthreads for linking

[email protected] Mon, 16 Mar 2026 21:31:55 +0000
Newsgroups gmane.os.freebsd.devel.standards
Message-ID <[email protected]/bugzilla/>
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=293859

--- Comment #5 from Matthias Andree <[email protected]> ---
Detail: the relevant calls are in .c files that, depending on compiler
settings, will either be #included directly from
src/test/OpenEXRCoreTest/compressionTables.cpp (or could possibly stand alone
as external objects) -- this hinges on OPENEXR_ENABLE_API_VISIBILITY which gets
#defined to be empty by default.

ll.45 ff of src/test/OpenEXRCoreTest/compressionTables.cpp:

#if defined(OPENEXR_ENABLE_API_VISIBILITY)
#include "../../lib/OpenEXRCore/internal_b44_table.c"
#include "../../lib/OpenEXRCore/internal_b44_table_init.c"
#include "../../lib/OpenEXRCore/internal_dwa_table.c"
#include "../../lib/OpenEXRCore/internal_dwa_table_init.c"
#else
...

src/lib/OpenEXRCore/internal_dwa_table_init.c
107:    call_once (&dwa_tables_once, init_dwa_tables);

src/lib/OpenEXRCore/internal_b44_table_init.c
56:    call_once (&b44_tables_once, init_b44_tables);

so those cannot use std::call_once (C++11) but need to use the C11 call_once.


These are the two relevant compiler/linker calls that cause the issue, to give
some more context:

[mandree@freeryzen ~/VCS-other/openexr.git]$ ninja -C _build/ -v
ninja: Entering directory `_build/'
[1/2] /usr/bin/c++ -DCOMP_EXTRA=\"\" -DCOMP_MAJ=3 -DCOMP_MIN=4 -DCOMP_PATCH=7
-DILM_IMF_TEST_IMAGEDIR=\"/home/mandree/VCS-other/openexr.git/src/test/OpenEXRCoreTest/../OpenEXRTest/\"
-I/home/mandree/VCS-other/openexr.git/_build/src/test/OpenEXRCoreTest
-I/home/mandree/VCS-other/openexr.git/src/test/OpenEXRCoreTest
-I/home/mandree/VCS-other/openexr.git/src/lib/OpenEXRCore
-I/home/mandree/VCS-other/openexr.git/_build/cmake
-I/home/mandree/VCS-other/openexr.git/src/lib/OpenEXR
-I/home/mandree/VCS-other/openexr.git/src/lib/Iex
-I/home/mandree/VCS-other/openexr.git/src/lib/IlmThread -isystem
/usr/local/include -isystem /usr/local/include/Imath -O3 -DNDEBUG -std=c++17
-pthread -MD -MT
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compressionTables.cpp.o
-MF
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compressionTables.cpp.o.d
-o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compressionTables.cpp.o
-c
/home/mandree/VCS-other/openexr.git/src/test/OpenEXRCoreTest/compressionTables.cpp
[2/2] : && /usr/bin/c++ -O3 -DNDEBUG -Xlinker
--dependency-file=src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/link.d
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/base_units.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/buffer.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compression.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compressionTables.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/deep.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/general_attr.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/main.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/read.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/write.cpp.o -o
bin/OpenEXRCoreTest 
-Wl,-rpath,/home/mandree/VCS-other/openexr.git/_build/src/lib/OpenEXR:/home/mandree/VCS-other/openexr.git/_build/src/lib/OpenEXRCore:/home/mandree/VCS-other/openexr.git/_build/src/lib/IlmThread:/home/mandree/VCS-other/openexr.git/_build/src/lib/Iex:/usr/local/lib
 src/lib/OpenEXR/libOpenEXR-3_4.so.33.3.4.7 
src/lib/OpenEXRCore/libOpenEXRCore-3_4.so.33.3.4.7 
/usr/local/lib/libImath-3_2.so.30.3.2.2  -lm 
src/lib/IlmThread/libIlmThread-3_4.so.33.3.4.7 
src/lib/Iex/libIex-3_4.so.33.3.4.7  -pthread  -Wl,-rpath-link,/usr/local/lib &&
:
FAILED: [code=1] bin/OpenEXRCoreTest 
: && /usr/bin/c++ -O3 -DNDEBUG -Xlinker
--dependency-file=src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/link.d
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/base_units.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/buffer.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compression.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compressionTables.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/deep.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/general_attr.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/main.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/read.cpp.o
src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/write.cpp.o -o
bin/OpenEXRCoreTest 
-Wl,-rpath,/home/mandree/VCS-other/openexr.git/_build/src/lib/OpenEXR:/home/mandree/VCS-other/openexr.git/_build/src/lib/OpenEXRCore:/home/mandree/VCS-other/openexr.git/_build/src/lib/IlmThread:/home/mandree/VCS-other/openexr.git/_build/src/lib/Iex:/usr/local/lib
 src/lib/OpenEXR/libOpenEXR-3_4.so.33.3.4.7 
src/lib/OpenEXRCore/libOpenEXRCore-3_4.so.33.3.4.7 
/usr/local/lib/libImath-3_2.so.30.3.2.2  -lm 
src/lib/IlmThread/libIlmThread-3_4.so.33.3.4.7 
src/lib/Iex/libIex-3_4.so.33.3.4.7  -pthread  -Wl,-rpath-link,/usr/local/lib &&
:
ld: error: undefined symbol: call_once
>>> referenced by compressionTables.cpp
>>>               src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compressionTables.cpp.o:(exrcore_ensure_b44_tables())
>>> referenced by compressionTables.cpp
>>>               src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compressionTables.cpp.o:(exrcore_ensure_dwa_tables())
>>> referenced by compressionTables.cpp
>>>               src/test/OpenEXRCoreTest/CMakeFiles/OpenEXRCoreTest.dir/compressionTables.cpp.o:(testDWATable(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&))
>>> referenced 2 more times
c++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

-- 
You are receiving this mail because:
You are the assignee for the bug.