Cmake 链接问题

Cmake linking issue

提问人:vishal saraswat 提问时间:3/24/2023 最后编辑:The Dreams Windvishal saraswat 更新时间:3/24/2023 访问量:75

问:

我正在尝试创建一个共享库,该库又使用 libtorch 和 libngt。libtorch 提供了一种将项目链接到自身的正确方法,并且效果很好,但不知何故,我在使用 cmake 链接 libngt 时遇到了问题。

我的CMakeLists.txt

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(blksim_test)

find_package(Torch REQUIRED)
link_directories("/usr/local/lib/")
add_executable(test_sim test_sim.cc hash_network.cc hash_pool.cc)
target_include_directories(test_sim PRIVATE ../include)
target_link_libraries(test_sim "${TORCH_LIBRARIES}")
target_link_libraries(test_sim ngt)
set_property(TARGET test_sim PROPERTY CXX_STANDARD 14 )

我遇到以下错误:

Error:
/usr/bin/ld: CMakeFiles/test_sim.dir/hash_pool.cc.o: in function `NGT::Index::open(std::string const&, bool)':
hash_pool.cc:(.text._ZN3NGT5Index4openERKSsb[_ZN3NGT5Index4openERKSsb]+0x2e): undefined reference to `NGT::Index::open(std::string const&, bool, bool)'
/usr/bin/ld: CMakeFiles/test_sim.dir/hash_pool.cc.o: in function `NGT::Index::createGraphAndTree(std::string const&, NGT::Property&, bool)':
hash_pool.cc:(.text._ZN3NGT5Index18createGraphAndTreeERKSsRNS_8PropertyEb[_ZN3NGT5Index18createGraphAndTreeERKSsRNS_8PropertyEb]+0x6c): undefined reference to `NGT::Index::createGraphAndTree(std::string const&, NGT::Property&, std::string const&, unsigned long, bool)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/test_sim.dir/build.make:133: test_sim] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/test_sim.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

我确保导出 并包含 libngt 所在的位置。PATHLD_LIBRARY_PATH/usr/local/lib

instance1:~/code$ ls -al /usr/local/lib/libngt.*
-rw-r--r-- 1 root root 4037082 Mar 20 21:40 /usr/local/lib/libngt.a
lrwxrwxrwx 1 root root      11 Mar 20 23:02 /usr/local/lib/libngt.so -> libngt.so.1
lrwxrwxrwx 1 root root      16 Mar 20 23:02 /usr/local/lib/libngt.so.1 -> libngt.so.1.14.5
-rw-r--r-- 1 root root 1581560 Mar 20 21:41 /usr/local/lib/libngt.so.1.14.5

我不知道我做错了什么。我是第一次使用 cmake,所以我几乎可以肯定我链接 libngt 的方式有问题。

我尝试在构建目录中创建一个,但即使这样也无济于事。我不知道我错过了什么。FindNGT.cmake

C++ CMake 链接器错误 ld

评论

0赞 drescherjm 3/24/2023
尝试在构建目录中创建一个 FindNGT.cmake,但即使这样也无济于事。然后,您需要一个 find_package(ngt REQUIRED) 供 CMake 使用它。
0赞 vishal saraswat 3/24/2023
我也尝试了find_package(在CMakeLists.txt中)以及FindNGT.cmake,但这并没有解决问题。
0赞 drescherjm 3/24/2023
你必须展示你的FindNGT.cmake
2赞 Tsyvarev 3/24/2023
@drescherjm:问题帖子中的代码实际上与库链接: 。但看起来该库没有定义它通常应该定义的符号......vishal saraswat:你可以打印库的内容,并检查库是否真的包含这些符号。ngttarget_link_libraries(test_sim ngt)nm -gDC /usr/local/lib/libngt.so.1.14.5
1赞 Tsyvarev 3/24/2023
您可以在输出中观察到的该命名空间似乎是一个问题:您的库是使用与 CMake 项目不同的设置构建的。例如,请参阅CMake中有关此设置的问题__cxx11::nm_GLIBCXX_USE_CXX11_ABI

答: 暂无答案