target_link_libraries调用后链接路径混乱

link path confusion after target_link_libraries call

本文关键字:链接 路径 混乱 调用 link libraries target      更新时间:2023-10-16

我有一个cmake项目,我想添加一个包含matlab引擎的类。为了编译它,我需要包含两个库engmx,我通过添加

来完成

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库。