【发布时间】: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