[英]C++ CMake compilation error (/usr/bin/ld: cannot find <LIBRARY_NAME>)
*我知道有很多關於這個的問題,但在談論 CMake 時它們根本沒有多大幫助,因此我決定提出這個問題 *
所以我正在研究 CLion,它使用 CMake 來導入並向編譯器提供參數,並成功地包含(導入)了一個位於名為“ExternalLibraries”的文件夾中的外部庫(谷物:將類序列化為 json 文件),該文件夾位於我的項目文件夾的根目錄。 它工作得很好,直到我重新啟動 IDE 並嘗試再次運行代碼......它返回了一個編譯錯誤(我認為)。
我的 CMake 文件如下所示:
cmake_minimum_required(VERSION 3.3)
project(xMemory)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories ("${PROJECT_SOURCE_DIR}/ExternalLibraries/cereal-1.1.2/include/")
set(SOURCE_FILES main.cpp xObject.cpp xObject.h)
add_executable(xMemory ${SOURCE_FILES})
target_link_libraries (xMemory cereal)
當我嘗試運行/編譯時,shell 給了我這個:
/home/lunaticsoul/Documents/clion-1.2.4/bin/cmake/bin/cmake --build /home/lunaticsoul/.CLion12/system/cmake/generated/95701c38/95701c38/Debug0 --target xMemory -- -j 4
Scanning dependencies of target xMemory
[ 33%] Building CXX object CMakeFiles/xMemory.dir/xObject.cpp.o
[ 66%] Building CXX object CMakeFiles/xMemory.dir/main.cpp.o
[100%] Linking CXX executable xMemory
/usr/bin/ld: cannot find -lcereal
collect2: error: ld returned 1 exit status
make[3]: *** [xMemory] Error 1
make[2]: *** [CMakeFiles/xMemory.dir/all] Error 2
make[1]: *** [CMakeFiles/xMemory.dir/rule] Error 2
make: *** [xMemory] Error 2
我不確定發生了什么,因為庫似乎實際上導入了代碼(包括谷物時沒有紅色字母),正如我之前所說,我認為它只是停止工作。
有人可以告訴我我的 CMake 文件是否有問題嗎?
PD:這是一個截圖,以防萬一有人需要它。
PD2:我使用的是基本操作系統:Freya(Ubuntu 14.04)
你應該使用
link_directories(directory1 directory2 ...)
指令來指定庫目錄。
https://cmake.org/cmake/help/v3.0/command/link_directories.html
我參加聚會有點晚了,但也許這會對某人有所幫助。 我對 googletest 有一個非常相似的問題:
dpoliaru@host:~/Documents/test/gtest/build$ make
Scanning dependencies of target s1
[ 50%] Building CXX object CMakeFiles/s1.dir/s1.cpp.o
[100%] Linking CXX executable s1
/usr/bin/ld: cannot find -lgtest
/usr/bin/ld: cannot find -lgmock
/usr/bin/ld: cannot find -lgtest
/usr/bin/ld: cannot find -lgmock
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/s1.dir/build.make:84: s1] Error 1
make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/s1.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
dpoliaru@host:~/Documents/test/gtest/build$
這是我用來調試它的方法:
確保您可以手動構建:
編譯:
g++ -c -m64 -I/home/dpoliaru/.local/lib/pkgconfig/../../include s1.cpp
和鏈接:
g++ -L/home/dpoliaru/.local/lib/pkgconfig/../../lib s1.o -o s1 -lgtest -lgmock -lpthread
確保 cmake 在生成階段正確定位庫:
dpoliaru@host:~/Documents/test/gtest/build$ cmake -L .. -D CMAKE_BUILD_TYPE=Debug
-- The C compiler identification is GNU 9.2.1
-- The CXX compiler identification is GNU 9.2.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1")
-- Checking for module 'gtest'
-- Found gtest, version 1.10.0
-- Checking for module 'gmock'
-- Found gmock, version 1.10.0
-- Configuring done
-- Generating done
-- Build files have been written to: /home/dpoliaru/Documents/test/gtest/build
-- Cache values
CMAKE_BUILD_TYPE:STRING=Debug
CMAKE_INSTALL_PREFIX:PATH=/usr/local
pkgcfg_lib_GMOCK_gmock:FILEPATH=/home/dpoliaru/.local/lib/libgmock.a
pkgcfg_lib_GMOCK_gtest:FILEPATH=/home/dpoliaru/.local/lib/libgtest.a
pkgcfg_lib_GMOCK_pthread:FILEPATH=/usr/lib/x86_64-linux-gnu/libpthread.so
pkgcfg_lib_GTEST_gtest:FILEPATH=/home/dpoliaru/.local/lib/libgtest.a
pkgcfg_lib_GTEST_pthread:FILEPATH=/usr/lib/x86_64-linux-gnu/libpthread.so
dpoliaru@host:~/Documents/test/gtest/build$
最后, rin CMakeLists.txt
,我使用 target_link_directories target_link_directories()
cmake-commands(7) 根據@mustafagonlu 建議更新了鏈接器目錄搜索路徑。
target_link_directories(${PROJECT_NAME} PUBLIC ${GTEST_LIBRARY_DIRS} ${GMOCK_LDFLAGS})
它奏效了。
如果添加,它會起作用:
target_link_libraries (xMemory /library_build_path/libcereal.a)
詳情:
ld 正在在定義的非常短的文件夾列表中尋找庫
/etc/ld.so.conf
它通常如下所示:
include /etc/ld.so.conf.d/*.conf
這些 *.conf 文件中的實際路徑列表通常類似於:
# Legacy biarch compatibility support
/lib32
/usr/lib32
# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
如果您的項目鏈接庫不在此列表的文件夾中,則 ld 將找不到它,除非特殊鏈接變量設置LD_LIBRARY_PATH與您的庫路徑或 cmake target_link_libraries指令中提供的完整路徑/庫名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.