【问题标题】:Cannot link external library using CMake, either library not found or undefined user reference无法使用 CMake 链接外部库,找不到库或未定义的用户引用
【发布时间】:2021-12-23 00:24:51
【问题描述】:

我获得了一个自定义 C++ 库,我需要它来进行我正在编写的一些模拟,并且被告知我应该使用 CMake 构建它(我应该注意我以前从未使用过 CMake)。我正在尝试编写一个 CMakeLists.txt 文件,以便可以调用该库中的函数。无论我尝试哪种方法,它都不想链接,但是现在包含所有相关的头文件就可以了。

关于升级的上下文,我在 WSL 上有 Ubuntu,但我需要的库位于外部硬盘驱动器上,如果这是问题所在,我可以更改它的结构。

在 WSL 上,我有:项目文件夹(CMakeLists.txt 所在的位置)-> 称为 Build 的子目录(我正在尝试构建它的位置)。

库结构为:D://some_path/Positioner->Poslib(我需要的头文件在这里) 数据 配置 等等。 该库在 Positioner 下还有一个 build 文件夹,具有相同的子目录名称,每个都包含一个 libname.a 文件。

我正在尝试链接到大多数库子目录以避免依赖性问题。如果相关,我尝试调用的函数都使用命名空间 Pos。

下面是我的 CMakeLists.txt 设置(我测试过的很多东西都被注释掉了抱歉):


project(wrapDelta)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

set(CMAKE_CXX_STANDARD 17)
#set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_AUTOMOC ON)

# Various compiler warnings from external include files are disabled with
# GCC pragmas but these are not supported before gcc version 6.
if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 6)
    add_compile_options(-Wall -pedantic-errors -Wextra -Werror)
else()
    add_compile_options(-Wall -pedantic-errors -Wextra -Werror
        -Wno-unused-variable -Wno-unused-parameter
        -Wno-maybe-uninitialized)
endif()

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

# Default path for finding the SOFA library
set(SOFA_DIR /home/name/sofa/20210512/c/src) 

#Setting directories for different positioner software libraries
set(POSLIB_DIR ${/mnt/d/pos/positioner/poslib/})
set(DATA_DIR ${/mnt/d/pos/positioner/data})
set(PLATE_GEN_DIR ${/mnt/d/pos/positioner/plate_gen})
set(CONFIGURE_DIR ${/mnt/d/pos/positioner/configure})
set(LIFU_DIR ${/mnt/d/pos/positioner/lifu_configure})


set(BOOST_INCLUDEDIR $ENV{/home/name/boost_1_77_0/boost})
set(BOOST_LIBRARYDIR $ENV{/usr/lib/x86_64-linux-gnu})
set(boost_filesystem_DIR /mnt/c/Program Files/boost/boost_1_77_0/stage/lib/cmake/boost_filesystem-1.77.0)


find_package(Boost 1.6 REQUIRED CONFIG
    COMPONENTS program_options system filesystem log unit_test_framework
)


find_library(SOFA t_sofa_c REQUIRED PATHS ${SOFA_DIR})          #libsofa_c.a REQUIRED PATHS /home/name/starlink/starlink/thirdparty/sofa/sofa/src)#/lib at the end
find_package(Qt5 5.9.5 REQUIRED COMPONENTS Core Widgets Xml PrintSupport Gui)

#find_library(LIB_POSLIB NAMES poslib libposlib.a REQUIRED PATHS ${POSLIB_DIR} NO_DEFAULT_PATH)

include_directories(/home/name/sofa/20210512/c/src) #/home/name/starlink/starlink/thirdparty/sofa/sofa/src)
include_directories(/mnt/d/pos/positioner/poslib)
include_directories(/mnt/d/pos/positioner/data)
include_directories(/mnt/d/pos/positioner/plate_gen)
include_directories(/mnt/d/pos/positioner/configure)
include_directories(/mnt/d/pos/positioner/lifu_configure)


include_directories(/mnt/d/pos/positioner/build/poslib)
include_directories(/mnt/d/pos/positioner/build/data)
include_directories(/mnt/d/pos/positioner/build/plate_gen)
include_directories(/mnt/d/pos/positioner/build/configure)
include_directories(/mnt/d/pos/positioner/build/lifu_configure)
include_directories(/mnt/d/pos/positioner/build/poslib)

include_directories(${Qt5Core_INCLUDE_DIRS})
include_directories(${Qt5Widgets_INCLUDE_DIRS})
include_directories(${Qt5Xml_INCLUDE_DIRS})
include_directories(${Qt5PrintSupport_INCLUDE_DIRS})
include_directories(${Qt5Gui_INCLUDE_DIRS})

link_directories(/home/name/sofa/20210512/c/src/) #/home/name/starlink/starlink/thirdparty/sofa/sofa/src)
link_directories("/mnt/d/pos/positioner/poslib/")
link_directories("/mnt/d/pos/positioner/data/")
link_directories("/mnt/d/pos/positioner/plate_gen/")
link_directories("/mnt/d/pos/positioner/configure/")
link_directories("/mnt/d/pos/positioner/lifu_configure/")

link_directories("/mnt/d/pos/positioner/build/poslib/")
link_directories("/mnt/d/pos/positioner/build/data/")
link_directories("/mnt/d/pos/positioner/build/plate_gen/")
link_directories("/mnt/d/pos/positioner/build/configure/")
link_directories("/mnt/d/pos/positioner/build/lifu_configure/")

file(GLOB poslib_Sources RELATIVE "/mnt/d/pos/positioner/poslib/" "*.cpp")
file(GLOB poslib_h_Sources RELATIVE "/mnt/d/pos/positioner/poslib/" "*.h")

add_executable(delta_wrap_test Delta_wrap_test.cpp ${poslib_Sources} ${poslib_h_Sources})

qt5_use_modules(delta_wrap_test Core Xml Gui Widgets PrintSupport)

add_library(python_delta SHARED Delta_wrap_test.cpp)


add_library(data STATIC IMPORTED GLOBAL)
set_target_properties(data PROPERTIES IMPORTED_LOCATION $ENV{/mnt/d/pos/positioner/build/data}/libconfig_files_resource.a)

add_library(plate_gen STATIC IMPORTED GLOBAL)
set_target_properties(plate_gen PROPERTIES IMPORTED_LOCATION $ENV{/mnt/d/pos/positioner/plate_gen}/libplate_files_resource.a)

add_library(configure SHARED IMPORTED GLOBAL)
set_target_properties(configure PROPERTIES IMPORTED_LOCATION $ENV{/mnt/d/pos/positioner/configure}/configure.cpp) #configure

add_library(lifu SHARED IMPORTED GLOBAL)
set_target_properties(lifu PROPERTIES IMPORTED_LOCATION $ENV{/mnt/d/pos/positioner/lifu_configure}/lifu_configure.cpp) #lifu_configure

add_library(sofa STATIC IMPORTED GLOBAL)
set_target_properties(sofa PROPERTIES IMPORTED_LOCATION $ENV{/home/name/sofa/20210512/c/src}/libsofa.a)


add_library(poslib STATIC IMPORTED GLOBAL)

set_target_properties(poslib PROPERTIES IMPORTED_LOCATION "/mnt/d/pos/positioner/build/poslib/")#$ENV{/mnt/d/pos/positioner/build/poslib}/libposlib.a)


#target_link_libraries(delta_wrap_test ${/mnt/d/pos/positioner/data})
#target_link_libraries(delta_wrap_test ${/mnt/d/pos/positioner/plate_gen})
#target_link_libraries(delta_wrap_test ${/mnt/d/pos/positioner/configure})
#target_link_libraries(delta_wrap_test ${/mnt/d/pos/positioner/lifu_configure})
#target_link_libraries(delta_wrap_test ${/mnt/d/pos/positioner/poslib})

#target_link_libraries(${delta_wrap_test} ${/home/name/sofa/20210512/c/src})

target_link_libraries(delta_wrap_test
    ${sofa}
    ${Boost_LIBRARIES}
    Qt5::Core
    Qt5::Widgets
    Qt5::Xml
    Qt5::PrintSupport
    Qt5::Gui
    Threads::Threads
    
)

#${LIB_POSLIB}

目前这是我收到的错误消息:

Scanning dependencies of target delta_wrap_test_autogen
[ 12%] Automatic MOC for target delta_wrap_test
[ 12%] Built target delta_wrap_test_autogen
Scanning dependencies of target delta_wrap_test
[ 25%] Building CXX object CMakeFiles/delta_wrap_test.dir/Delta_wrap_test.cpp.o
[ 37%] Building CXX object CMakeFiles/delta_wrap_test.dir/delta_wrap_test_autogen/mocs_compilation.cpp.o
[ 50%] Linking CXX executable delta_wrap_test
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
CMakeFiles/delta_wrap_test.dir/Delta_wrap_test.cpp.o: In function `Delta_wrap_test::define(QString)':
Delta_wrap_test.cpp:(.text+0xa7): undefined reference to `pos::loadXmlFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
CMakeFiles/delta_wrap_test.dir/Delta_wrap_test.cpp.o: In function `Delta_wrap_test::applyMove()':
Delta_wrap_test.cpp:(.text+0x1d4): undefined reference to `pos::PhysicalPlate::parkFibre(int, bool)'
Delta_wrap_test.cpp:(.text+0x1e1): undefined reference to `pos::Plate::moveFibre(int, bool)'
Delta_wrap_test.cpp:(.text+0x1fd): undefined reference to `pos::Delta::dumpFibre(unsigned int) const'
collect2: error: ld returned 1 exit status
CMakeFiles/delta_wrap_test.dir/build.make:134: recipe for target 'delta_wrap_test' failed
make[2]: *** [delta_wrap_test] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/delta_wrap_test.dir/all' failed
make[1]: *** [CMakeFiles/delta_wrap_test.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

任何帮助/建议将不胜感激,因为在这个阶段我的想法已经不多了。

【问题讨论】:

  • 设置set(POSLIB_DIR ${/mnt/d/pos/positioner/poslib/})肯定是错误:构造${..}提取变量的值,但/mnt/d/pos/positioner/poslib/路径。相反,请尝试set(POSLIB_DIR "/mnt/d/pos/positioner/poslib/")
  • 我这样做了,但遗憾的是它仍然找不到库。我还尝试完全删除 LIB_POSLIB 部分并再次在 target_link_directory 中使用 poslib 并得到与此相同的错误。
  • delta_wrap_test 的源是否包含具有适当签名的main 函数的定义?缺少的函数是否在源文件中定义(除非由 moc 生成)?顺便说一句:对 gcc 版本的 if 测试是错误的,因为版本 6 不大于 6;此外允许重复的add_compile_options 命令:add_compile_options(-Wall -pedantic-errors -Wextra -Werror) if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 6) add_compile_options(-Wno-unused-variable -Wno-unused-parameter -Wno-maybe-uninitialized) endif()
  • 此外,如果您使用这些包含将Qt5::Gui 链接到目标,则不需要像include_directories(${Qt5Gui_INCLUDE_DIRS}) 这样的命令;导入的目标Qt5::Gui 自动提供信息,使相关的包含目录可用于链接目标。
  • delta_wrap_test 目前只是我正在尝试编写的一个类,因此没有任何 ``main{}``` 的实例。缺少的函数在 poslib 的头文件和源文件中定义。

标签: c++ cmake windows-subsystem-for-linux


【解决方案1】:

所以我现在已经解决了这个问题

target_link_libraries(delta_wrap_test "/mnt/d/pos/positioner/build/poslib/libposlib.a")

但是,我现在意识到我从中得到的更多错误来自 libposlib.a 库,这取决于我也在链接的 Sofa 库,所以我相信我需要创建一个新的静态库来链接那些在这将起作用之前。欢迎任何关于将不同目录中的静态库链接在一起的建议。

#####更新#### 这是最终能够编译我的代码而没有错误的最终 CMake:

cmake_minimum_required(VERSION 3.5)
cmake_policy(SET CMP0060 NEW)

project(wrapDelta)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

set(CMAKE_CXX_STANDARD 14)
#set(CMAKE_CXX_STANDARD 17)
#set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_AUTOMOC ON)
set(LINUX TRUE)

# Various compiler warnings from external include files are disabled with
# GCC pragmas but these are not supported before gcc version 6.
if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 6)
    add_compile_options( -L/usr/lib/x86_64-linux-gnu -lboost_system-Wall -pedantic-errors -Wextra -Werror)
else()
    add_compile_options( -L/usr/lib/x86_64-linux-gnu -lboost_system -Wall -pedantic-errors -Wextra -Werror
        -Wno-unused-variable -Wno-unused-parameter
        -Wno-maybe-uninitialized -DBoost_USE_STATIC_LIBS=ON)
endif()

#set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

#set(Boost_NO_BOOST_CMAKE TRUE)
#set(Boost_NO_SYSTEM_PATHS TRUE)
#set(Boost_USE_STATIC_LIBS TRUE)
set(Boost_USE_STATIC_LIBS OFF) 
#set(Boost_USE_MULTITHREADED ON)  
#set(Boost_USE_STATIC_RUNTIME OFF) 
#set(Boost_NO_SYSTEM_PATHS TRUE)
SET(Boost_DEBUG ON)

#set( BOOST_ROOT "" CACHE PATH /usr/lib/x86_64-linux-gnu/ )
#set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )

# Default path for finding the SOFA library
set(SOFA_DIR /home/name/sofa/20210512/c/src/) 

#Setting directories for different positioner software libraries

set(POSLIB_DIR /mnt/d/pos/positioner/build/poslib/) #/mnt/d/pos/positioner/poslib/)
set(DATA_DIR "mnt/d/pos/positioner/data")
set(PLATE_GEN_DIR "/mnt/d/pos/positioner/plate_gen")
set(CONFIGURE_DIR "/mnt/d/pos/positioner/configure")
set(LIFU_DIR "/mnt/d/pos/positioner/lifu_configure")

#set(Boost_ROOT /usr/include/boost/)
#set(Boost_DIR /usr/include/boost/)
#set(BOOST_INCLUDEDIR /usr/lib/x86_64-linux-gnu/)
#set(BOOST_LIBRARYDIR /usr/lib/x86_64-linux-gnu/)
#set(boost_filesystem_DIR /usr/lib/x86_64-linux-gnu/)

###testing library inclusion
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
set(LIBS ${/usr/lib/cmake/Boost-1.77.0/})


find_package(Boost 1.65 REQUIRED CONFIG
    COMPONENTS filesystem program_options log unit_test_framework system PATHS ${BOOST_ROOT}) 
#EXACT
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(SYSTEM ${Boost_INCLUDE_DIR})
    link_directories (${BOOST_LIBRARYDIR})
ENDIF()

find_library(LIB_POSLIB NAMES poslib REQUIRED PATHS ${POSLIB_DIR})

####keep the library name as Sofa not SOFA
find_library(Sofa libsofa_c.a REQUIRED PATHS ${SOFA_DIR})
find_package(Qt5 5.9.5 REQUIRED COMPONENTS Core Widgets Xml PrintSupport Gui)

include_directories("/home/name/sofa/20210512/c/src/") 
include_directories("/mnt/d/pos/positioner/poslib/")
include_directories("/mnt/d/pos/positioner/data/")
include_directories("/mnt/d/pos/positioner/plate_gen/")
include_directories("/mnt/d/pos/positioner/configure/")
include_directories("/mnt/d/pos/positioner/lifu_configure/")


include_directories("/mnt/d/pos/positioner/build/poslib/")
include_directories("/mnt/d/pos/positioner/build/data/")
include_directories("/mnt/d/pos/positioner/build/plate_gen/")
include_directories("/mnt/d/pos/positioner/build/configure/")
include_directories("/mnt/d/pos/positioner/build/lifu_configure/")
include_directories("/mnt/d/pos/positioner/build/poslib/")

include_directories(${Boost_INCLUDE_DIRS})
include_directories(${Qt5Widgets_INCLUDE_DIRS})
include_directories(${Qt5Core_INCLUDE_DIRS})
include_directories(${Qt5Xml_INCLUDE_DIRS})
include_directories(${Qt5PrintSupport_INCLUDE_DIRS})
include_directories(${Qt5Gui_INCLUDE_DIRS})

link_directories("/home/sarah/sofa/20210512/c/src/") 
link_directories("/mnt/d/pos/positioner/poslib/")
link_directories("/mnt/d/pos/positioner/data/")
link_directories("/mnt/d/pos/positioner/plate_gen/")
link_directories("/mnt/d/pos/positioner/configure/")
link_directories("/mnt/d/pos/positioner/lifu_configure/")

link_directories("/mnt/d/pos/positioner/build/poslib/")
link_directories("/mnt/d/pos/positioner/build/data/")
link_directories("/mnt/d/pos/positioner/build/plate_gen/")
link_directories("/mnt/d/pos/positioner/build/configure/")
link_directories("/mnt/d/pos/positioner/build/lifu_configure/")

link_directories(${Boost_LIBRARY_DIRS})


add_executable(delta_wrap_test Delta_wrap_test.cpp ${poslib_Sources} ${poslib_h_Sources})

qt5_use_modules(delta_wrap_test Core Xml Gui Widgets PrintSupport)

add_library(python_delta SHARED Delta_wrap_test.cpp)


target_link_libraries(delta_wrap_test 
    ${LIB_POSLIB}
    ${Sofa}
    boost_filesystem
    boost_system
    ${Boost_LIBRARIES}
    Boost::system
    Boost::thread  
    Qt5::Core
    Qt5::Widgets
    Qt5::Xml
    Qt5::PrintSupport
    Qt5::Gui
    Threads::Threads  
    
)

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2019-04-23
    • 2021-09-17
    相关资源
    最近更新 更多