Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在CMake中将静态库与测试应用程序一起使用时发生链接器错误_C++_Cmake_Centos7_Linker Errors - Fatal编程技术网

C++ 在CMake中将静态库与测试应用程序一起使用时发生链接器错误

C++ 在CMake中将静态库与测试应用程序一起使用时发生链接器错误,c++,cmake,centos7,linker-errors,C++,Cmake,Centos7,Linker Errors,我的静态库的项目结构与中定义的完全相同,我的CMakeList.txt也完全相同: cmake_minimum_required (VERSION 2.8) project (project_name) add_subdirectory (src) add_subdirectory (test) 我想在静态库之后构建测试文件夹。我还添加了add_test(),但唯一的问题是我的测试目录不包含单元测试,而是实际的测试应用程序,如以下代码: #include <iostream&g

我的静态库的项目结构与中定义的完全相同,我的CMakeList.txt也完全相同:

cmake_minimum_required (VERSION 2.8) 
project (project_name) 

add_subdirectory (src) 
add_subdirectory (test) 
我想在静态库之后构建测试文件夹。我还添加了
add_test()
,但唯一的问题是我的测试目录不包含单元测试,而是实际的测试应用程序,如以下代码:

#include <iostream>
main() {
 /* 
   this code uses static library functions in it. There is not Unit Test defined in it.
*/
}
libdal/test/CMakeList.txt

cmake_minimum_required(VERSION 3.12)
project(dal)

# Flags Variables
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")

# Include Directeries
include_directories(${CPP_KAFKA_INC})
include_directories(${CPP_MYSQL_INC})
include_directories(${CPP_ALTIBASE_INC})
include_directories(${AFN_STATE_INC})
include_directories(${AFN_DAL_INC})
include_directories(${AFN_COMMONS_INC})
include_directories(${AFN_CONFIG_INC})
include_directories(${SQL_ODBC_INC})
# Executable Target(s)
file(GLOB SOURCES *.cpp)
add_library(${PROJECT_NAME} ${SOURCES})

target_link_libraries(${PROJECT_NAME}
        ${AFN_LIB}
        "-lafinit_state"
        "-luuid"
        "-lz"
        "-lpthread"
        ${PQXX_LIB}
        ${PQ_LIB}
        "-lmysqlcppconn"
        ${libmscpp}
        ${kafkacpplib}
        ${rdkafkalib}
        ${rdkafkacpplib}
        afiniti_config $<$<CONFIG:DEBUG>:-lgcov>
        )

# Installation
install(CODE "MESSAGE(\"Installing ${PROJECT_NAME} \")")
install(TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)
cmake_minimum_required(VERSION 3.12)
project(testdal)

# Flags Variables
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17" )

option(DAL_PUSH_TESTER      "enable DAL push tester"    ON)

# Include Directeries
include_directories(${CPP_KAFKA_INC})
include_directories(${AFN_DAL_INC})
include_directories(${CPP_MYSQL_INC})
include_directories(${AFN_STATE_INC})
include_directories(${AFN_CONFIG_INC})

add_executable(${PROJECT_NAME}  main.cpp)
target_link_libraries(${PROJECT_NAME}
        ${AFN_LIB}
        "-lmysqlcppconn"
        "-luuid"
        "-lz"
        ${libmscpp}
        "-ldal"
        ${PQXX_LIB}
        ${PQ_LIB}
        ${kafkacpplib}
        ${rdkafkalib}
        ${rdkafkacpplib}
        "-lafinit_state"
        "-luuid"
        "-lpthread"
        afiniti_config $<$<CONFIG:DEBUG>:-lgcov>
        ${AFN_LICENSE_LIB} "-laf_license_manager"
        )
    # Installation
install(CODE "MESSAGE(\"Installing ${PROJECT_NAME} \")")
install(TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin/tests
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)


if (DAL_PUSH_TESTER)
    add_executable(dal_push_tester dal_push_tester.cpp)
    target_link_libraries(dal_push_tester
            ${AFN_LIB}
            "-lmysqlcppconn"
            "-luuid"
            "-lz"
            ${libmscpp}
            "-ldal"
            ${PQXX_LIB}
            ${PQ_LIB}
            ${kafkacpplib}
            ${rdkafkalib}
            ${rdkafkacpplib}
            "-lafinit_state"
            "-luuid"
            "-lpthread"
            afiniti_config $<$<CONFIG:DEBUG>:-lgcov>
            ${AFN_LICENSE_LIB} "-laf_license_manager"
            )
# Installation
install(CODE "MESSAGE(\"Installing dal_push_tester  \")")
install(TARGETS dal_push_tester 
        RUNTIME DESTINATION bin/tests
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

endif ()

cmake_最低要求(3.12版)
项目(testdal)
#标志变量
设置(CMAKE_CXX_标志“${CMAKE_CXX_标志}-std=c++17”)
选项(DAL_推压测试仪“启用DAL推压测试仪”打开)
#包括导演
包括目录(${CPP_KAFKA_INC})
包括目录(${AFN\u DAL\u INC})
包括目录(${CPP\u MYSQL\u INC})
包括目录(${AFN\u STATE\u INC})
包含目录(${AFN\u CONFIG\u INC})
添加可执行文件(${PROJECT\u NAME}main.cpp)
目标链接库(${PROJECT\u NAME}
${AFN_LIB}
“-LMYSQLCPCPCONN”
“-luuid”
“-lz”
${libmscpp}
“-ldal”
${PQXX_LIB}
${PQ_LIB}
${kafkacplib}
${rdkafkalib}
${rdkafkacplib}
“-拉菲尼特州”
“-luuid”
“-lpthread”
afiniti_配置$
${AFN_LICENSE_LIB}“-laf_LICENSE_manager”
)
#装置
安装(代码“消息(\“安装${PROJECT\u NAME}\”))
安装(目标${PROJECT\u NAME}
运行时目标箱/测试
库目标库
存档目标库)
if(DAL_推力测试仪)
添加可执行文件(dal_push_tester dal_push_tester.cpp)
目标链接库(dal推送测试仪
${AFN_LIB}
“-LMYSQLCPCPCONN”
“-luuid”
“-lz”
${libmscpp}
“-ldal”
${PQXX_LIB}
${PQ_LIB}
${kafkacplib}
${rdkafkalib}
${rdkafkacplib}
“-拉菲尼特州”
“-luuid”
“-lpthread”
afiniti_配置$
${AFN_LICENSE_LIB}“-laf_LICENSE_manager”
)
#装置
安装(代码“消息(\“安装dal\U推压测试仪”)
安装(目标)dal_push_测试仪
运行时目标箱/测试
库目标库
存档目标库)
endif()

这个问题已经在网站上提出了好几次,但是您的CMake文件还有一些其他问题需要解释

问题是链接器不知道在哪里可以找到
dal
库,因为您只提供了
“-ldal”
,而没有指向库的完整路径或任何内容。您只需在
target\u link\u libraries()
中使用CMake库目标名称(
dal
)即可解决此问题,因为它是在同一CMake调用中较早定义的

target_link_libraries(${PROJECT_NAME}
        ${AFN_LIB}
        "-lmysqlcppconn"
        "-luuid"
        "-lz"
        ${libmscpp}
        dal              #   <------ Note the change on this line.
        ${PQXX_LIB}
        ${PQ_LIB}
        ${kafkacpplib}
        ${rdkafkalib}
        ${rdkafkacpplib}
        "-lafinit_state"
        "-luuid"
        "-lpthread"
        afiniti_config $<$<CONFIG:DEBUG>:-lgcov>
        ${AFN_LICENSE_LIB} "-laf_license_manager"
        )
此外,手动修改此行中的
CMAKE\u CXX\u标志

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
他非常气馁。设置C++标准时,应使用:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
或者本文讨论的其他更现代的方法之一


我鼓励您浏览一些关于的内容。

这个问题在网站上已经提出过好几次,但是您的CMake文件还有一些其他问题需要解释

问题是链接器不知道在哪里可以找到
dal
库,因为您只提供了
“-ldal”
,而没有指向库的完整路径或任何内容。您只需在
target\u link\u libraries()
中使用CMake库目标名称(
dal
)即可解决此问题,因为它是在同一CMake调用中较早定义的

target_link_libraries(${PROJECT_NAME}
        ${AFN_LIB}
        "-lmysqlcppconn"
        "-luuid"
        "-lz"
        ${libmscpp}
        dal              #   <------ Note the change on this line.
        ${PQXX_LIB}
        ${PQ_LIB}
        ${kafkacpplib}
        ${rdkafkalib}
        ${rdkafkacpplib}
        "-lafinit_state"
        "-luuid"
        "-lpthread"
        afiniti_config $<$<CONFIG:DEBUG>:-lgcov>
        ${AFN_LICENSE_LIB} "-laf_license_manager"
        )
此外,手动修改此行中的
CMAKE\u CXX\u标志

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
他非常气馁。设置C++标准时,应使用:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
或者本文讨论的其他更现代的方法之一


我鼓励您浏览一些关于项目结构的内容。

项目结构在某种程度上是用户的偏好。我不认为结构与您的问题有关。@drescherjm谢谢您指出,我已经在我的问题中添加了它们。项目结构有点像用户偏好的东西。我不认为结构与你的问题有关。@drescherjm谢谢你指出,我已经在我的问题中添加了它们。谢谢你指出我的错误,似乎是
-ldal
是罪魁祸首谢谢你指出我的错误,似乎是
-ldal
是罪魁祸首