在target_link_libraries调用之后链接路径混淆

时间:2014-06-11 11:02:07

标签: c++ gcc cmake matlab-deployment

我有一个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文件。用两个##注释掉的行是我之前尝试过的替代方案,并没有解决我的问题。 我还在target_link_libraries命令中添加了LINK_PRIVATE,如下面的代码所示,这没有什么区别。 单独选项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 )  

1 个答案:

答案 0 :(得分:1)

您可以尝试使用imported target

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