簡體   English   中英

C++ 程序編譯並鏈接,但隨后引發未定義符號錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM