target_link_libraries调用后链接路径混乱
link path confusion after target_link_libraries call
我有一个cmake项目,我想添加一个包含matlab引擎的类。为了编译它,我需要包含两个库eng
和mx
,我通过添加
target_link_libraries( ${TARGET} /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so)
target_link_libraries( ${TARGET} /usr/local/MATLAB/R2013b/bin/glnxa64/libmx.so)
到我的CMakeLists.txt
文件。然而,在/usr/local/MATLAB/R2013b/bin/glnxa64/
中也有许多其他旧版本的库,看起来在调用上述命令时也自动添加到路径中。我认为这会导致编译器找不到我的正常的库,并产生错误。
如何在glnxa64
文件夹中只包含上述两个库,而不包括所有其他库?
运行cmake .
后显示的警告:
CMake Warning at CMakeLists.txt:23 (add_executable):
Cannot generate a safe runtime search path for target CCDWidget because
files in some directories may conflict with libraries in implicit
directories:
runtime library [libboost_program_options.so.1.49.0] in /usr/lib may be hidden by files in:
/usr/local/MATLAB/R2013b/bin/glnxa64
runtime library [libboost_system.so.1.49.0] in /usr/lib may be hidden by files in:
/usr/local/MATLAB/R2013b/bin/glnxa64
runtime library [libboost_filesystem.so.1.49.0] in /usr/lib may be hidden by files in:
/usr/local/MATLAB/R2013b/bin/glnxa64
runtime library [libboost_regex.so.1.49.0] in /usr/lib may be hidden by files in:
/usr/local/MATLAB/R2013b/bin/glnxa64
Some of these libraries may not be found correctly.
和链接时的错误信息:
Linking CXX executable CCDWidget
/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined reference to `FT_Face_GetCharVariantIndex'
/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined reference to `FT_Get_Advance'
collect2: error: ld returned 1 exit status
make[2]: *** [CCDWidget] Error 1
make[1]: *** [CMakeFiles/CCDWidget.dir/all] Error 2
make: *** [all] Error 2
下面是我完整的CMakeLists.txt
文件。用两个##注释掉的行是我以前尝试过的替代方案,但没有解决我的问题。我还将LINK_PRIVATE
添加到target_link_libraries命令中,如下面的代码所示,这没有什么不同。选项PRIVATE
单独似乎不被我的cmake版本接受,因为它将错误信息更改为
/usr/bin/ld: cannot find -lPRIVATE
collect2: error: ld returned 1 exit status
当#eng
行被注释掉时,编译和链接工作正常,没有错误(当调用matlab引擎时,在Readout.cpp
中也被注释掉),所以错误必须由那一行产生。
#Specify the version being used as well as the language
cmake_minimum_required(VERSION 2.6)
##cmake_policy(SET CMP0003 NEW)
#Name your project here
project(CCDWidget)
set(TARGET CCDWidget)
set(MAIN_SOURCES CCDWidget.cpp main.cc CCDControl.cpp VideoWindow.cpp ImageWindow.cpp ThisMeasurement.cpp KineticSeries.cpp FastKinetics.cpp Readout.cpp)
##SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#set_source_files_properties(Readout.cpp PROPERTIES COMPILE_FLAGS "-I/usr/local/MATLAB/R2013b/extern/include -I/usr/local/MATLAB/R2013b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -I/usr/local/MATLAB/R2013b/extern/include/cpp -I/usr/local/MATLAB/R2013b/extern/include -DGLNXA64 -DGCC -DMX_COMPAT_32 -DNDEBUG -Wno-effc++")
find_package(Boost COMPONENTS program_options system filesystem regex REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTKMM gtkmm-3.0)
include_directories( ${GTKMM_INCLUDE_DIRS} )
include_directories( ${Boost_INCLUDE_DIR} )
include_directories( ${PROJECT_SOURCE_DIR} )
##link_directories(/usr/local/MATLAB/R2013b/bin/glnxa64)
##target_link_libraries( ${TARGET} eng)
##target_link_libraries( ${TARGET} mx)
set(CMAKE_CXX_FLAGS "--std=c++11")
add_executable( ${TARGET} ${MAIN_SOURCES} )
target_link_libraries( ${TARGET} ${GTKMM_LIBRARIES} )
target_link_libraries( ${TARGET} ${Boost_LIBRARIES} )
target_link_libraries( ${TARGET} LINK_PRIVATE /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so) # eng
#target_link_libraries( ${TARGET} LINK_PRIVATE /usr/local/MATLAB/R2013b/bin/glnxa64/libmx.so ) # mx
target_link_libraries( ${TARGET} andor )
您可以尝试使用导入的目标:
add_library(eng SHARED IMPORTED)
set_property(TARGET eng PROPERTY IMPORTED_LOCATION /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so)
...
add_executable( ${TARGET} ${MAIN_SOURCES} )
...
target_link_libraries(${TARGET} eng)
对于调试,你可以尝试使用"make VERBOSE=1"来构建。
这将显示使用的gcc命令行。CMake可能会将target_link_libraries命令转换为:
g++ ... -L/usr/local/MATLAB/R2013b/bin/glnxa64 -leng ...
gcc然后在这个文件夹中找到一些boost库。
- 在 Visual Studio 2010(及更高版本)中定义包含或链接路径变量的位置
- 如何在g++中从链接库中删除路径
- CMake 链接 2 个具有相对路径的库
- 在可执行文件中使用带有符号链接的相对路径
- 链接库时的默认目录上的GCC或G 路径搜索顺序
- CMake为什么通过相对路径链接外部库
- mingw链接路径
- 如何将共享库与具有相对路径的 CMake 链接
- 使用 cmake 的不同链接和加载库路径
- 编译C++中动态链接库,存在运行路径问题
- 访问注册表数据以设置链接器和包含路径
- CMake链接路径
- C++:链接器找不到 -lcrypto,但库在路径中
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- 如何避免动态链接的完整路径
- 路径文件存在导致链接器错误 2028/2019
- G++添加包含和链接路径
- 如何找到外部变量的链接路径
- target_link_libraries调用后链接路径混乱
- 在cygwin下提升c++静态链接路径