【问题标题】:link path confusion after target_link_libraries calltarget_link_libraries 调用后的链接路径混淆
【发布时间】:2014-08-01 09:55:21
【问题描述】:

我有一个 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,如下面的代码所示,这并没有什么区别。 我的cmake版本似乎不接受单独的选项PRIVATE,因为它将错误消息更改为

/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 )  

【问题讨论】:

    标签: c++ gcc cmake matlab-deployment


    【解决方案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) 
    

    对于调试,您可以尝试使用“ma​​ke VERBOSE=1”进行构建。
    这将向您显示使用的 gcc 命令行。 CMake 可能会将您的 target_link_libraries 命令转换为:

    g++ ... -L/usr/local/MATLAB/R2013b/bin/glnxa64 -leng ... 
    

    gcc 然后在这个文件夹中找到一些 boost 库。

    【讨论】:

    • 感谢您的建议,但不幸的是仍然出现相同的错误,或者如果我将'SHARED'更改为'MODULE'或'STATIC'并取消注释引擎调用函数,库不是找到了,和 /usr/bin/ld 之类的错误:警告:libut.so,/usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so 需要,未找到(尝试使用 -rpath 或 -rpath-link ) 出现
    • 详细输出为 /usr/bin/c++ --std=c++11 ... /usr/local/MATLAB/R2013b/bin/glnxa64/libeng.so /usr/local/ MATLAB/R2013b/bin/glnxa64/libmx.so -Wl,-rpath,/usr/local/MATLAB/R2013b/bin/glnxa64
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2017-03-15
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2013-12-17
    • 2018-08-25
    相关资源
    最近更新 更多