[英]C++ program compiles and links, but then raises undefined symbol error
我對這個問題感到非常頭疼,因為我根本無法弄清楚它為什么會發生。 我無法在我自己的機器上重現它,但它一直發生在同事身上。
我有一個 C++ 程序,它編譯和鏈接沒有任何錯誤(在他們的機器上也是如此)。 但是當試圖執行它時,他們得到一個“未定義的符號錯誤”——即使鏈接沒有拋出任何錯誤。
你有什么建議可能是什么原因? 我檢查了依賴項的鏈接順序,CMake 版本,編譯器版本等,但沒有進一步了解。
粗略地說,CMakeLists.txt 看起來像這樣:
cmake_minimum_required(VERSION 3.18.2)
project(name)
set(TARGET targetname)
add_library(dependency OBJECT ${DEPENDENCY_SOURCES})
add_dependencies(${TARGET} dependency)
target_include_directories(${TARGET} PRIVATE ${DEPENDENCY_SOURCE_DIR}/src)
target_link_libraries(${TARGET} PRIVATE ${dependency})
實際項目在這里(不想做廣告,我只是在這一點上迷路了)
PS:
下面給出一個例子。 如前所述,安裝沒有任何問題,但運行時缺少符號。
錯誤消息如下所示,然后嘗試從 Python 執行程序(C++ 函數通過 Pybind11 綁定):
PS 2:
我從同事那里得到了安裝日志。 我唯一的區別是 CMake 找不到 OpenMP 庫。
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /home/aco/miniconda3/envs/my_hetbuilder/bin/x86_64-conda-linux-gnu-cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/aco/miniconda3/envs/my_hetbuilder/bin/x86_64-conda-linux-gnu-c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Project source directory: /tmp/pip-req-build-hb5tu6_r
-- CMAKE_BUILD_TYPE=RELEASE
-- Found Python3: /home/aco/miniconda3/envs/my_hetbuilder/bin/python3.8 (found version "3.8.12") found components: Interpreter Development Development.Module Development.Embed
-- Found Python3 header files /home/aco/miniconda3/envs/my_hetbuilder/include/python3.8
-- Submodule update
-- Performing Test HAS_FLTO
-- Performing Test HAS_FLTO - Success
-- Found pybind11: /home/aco/miniconda3/envs/my_hetbuilder/include (found version "2.7.1" )
-- Building spglib from submodule.
-- Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS OpenMP_C_LIB_NAMES) (Required is at least version "4.5")
-- Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES) (Required is at least version "4.5")
-- Could NOT find OpenMP (missing: OpenMP_C_FOUND OpenMP_CXX_FOUND) (Required is at least version "4.5")
-- Could not find OpenMP
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
EXAMPLE_VERSION_INFO
PYTHON_EXECUTABLE
-- Build files have been written to: /tmp/pip-req-build-hb5tu6_r/build/temp.linux-x86_64-3.8
[ 3%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/arithmetic.c.o
[ 6%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/cell.c.o
[ 10%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/debug.c.o
[ 13%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/delaunay.c.o
[ 16%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/determination.c.o
[ 20%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/hall_symbol.c.o
[ 23%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/kgrid.c.o
[ 26%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/kpoint.c.o
[ 30%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/mathfunc.c.o
[ 33%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/niggli.c.o
[ 36%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/overlap.c.o
[ 40%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/pointgroup.c.o
[ 43%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/primitive.c.o
[ 46%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/refinement.c.o
[ 50%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/site_symmetry.c.o
[ 53%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/sitesym_database.c.o
[ 56%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/spacegroup.c.o
[ 60%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/spg_database.c.o
[ 63%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/spglib.c.o
[ 66%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/spin.c.o
[ 70%] Building C object CMakeFiles/hetbuildersymspg.dir/external/spglib/src/symmetry.c.o
[ 70%] Built target hetbuildersymspg
[ 73%] Building CXX object CMakeFiles/hetbuilder_backend.dir/backend/pybindings.cpp.o
[ 76%] Building CXX object CMakeFiles/hetbuilder_backend.dir/backend/atom_class.cpp.o
[ 80%] Building CXX object CMakeFiles/hetbuilder_backend.dir/backend/atom_functions.cpp.o
[ 83%] Building CXX object CMakeFiles/hetbuilder_backend.dir/backend/coincidence_algorithm.cpp.o
[ 86%] Building CXX object CMakeFiles/hetbuilder_backend.dir/backend/helper_classes.cpp.o
[ 90%] Building CXX object CMakeFiles/hetbuilder_backend.dir/backend/interface_class.cpp.o
[ 93%] Building CXX object CMakeFiles/hetbuilder_backend.dir/backend/logging_functions.cpp.o
[ 96%] Building CXX object CMakeFiles/hetbuilder_backend.dir/backend/math_functions.cpp.o
[100%] Linking CXX shared module ../lib.linux-x86_64-3.8/hetbuilder_backend.cpython-38-x86_64-linux-gnu.so
[100%] Built target hetbuilder_backend
ldd
是否顯示libsymspg
未鏈接或鏈接無法解析?
有很多編譯器和 linker 選項用於在構建時和運行時如何解析符號,並且 CMake 通常不會將構建系統設置為要求來自外部 Z099FB995346F31C749F6E4071 的符號在構建時實際上是可解析的。
如果您在LDD ldd
中根本看不到libsymspg
,則需要添加鏈接flags(最好使用target_link_libraries
使用Symspg,如果Symspg提供ZDF49ADB9B9E0C10C10C10C64F727294F724F72724F724F724F724F724BBANED1929294F724BB.294F724BBBANED19294F724BBBAR
如果您在ldd
output 中看到libsymspg
,但無法解析,則需要向加載程序提供提示。 通常,要么添加到 LD_LIBRARY_PATH 環境變量,要么配置二進制文件的 RPATH。 CMake supports several paradigms, so there are various relevant properties ( https://cmake.org/cmake/help/latest/search.html?q=RPATH ), and your choice depends to some extent on your intended relocatability for your package and關於依賴項的預期 ABI 兼容性。 但是你可以從INSTALL_RPATH_USE_LINK_PATH開始
原始帖子可能具有誤導性:您暗示您正在鏈接共享 object 庫,但情況似乎並非如此。
Comparing https://github.com/romankempt/hetbuilder/blob/6cf49f1e39c7f24cc75bfa696c5623b5a882c9aa/CMakeLists.txt to the output you shared, you are not linking against libsymspg.so
(nor libsymspg.a
). 您只是在構建它的一些源文件並將 object 文件直接鏈接到您的二進制文件中(使用本地 OBJECT 目標)。 想必,你錯過了一個。
另請注意,有一些方法可以在構建時嘗試捕獲此類事情。 例如,參見--no-undefined
(gnu ld) 選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.