CMake:无法在项目中编译 C 库依赖项C++



我有一个c++ cmake项目,叫它p,它在Linux上使用make。P可执行文件依赖于2个共享库,T和s。如果还没有找到这些库,我希望cmake构建它们。

Library T构建得很好,因为它是一个c++库。它按预期在P之前构建。

Library S是一个C库。它没有在p之前构建,当make链接到它抱怨找不到s

显然因为它不构成S

T和S都使用自己的构建。cmake文件,我在CMakeLists.txt中调用include()。如果我改变S的构造。cmake到CMakeLists.txt并构建它,它将创建库没有问题。然后我可以调用P的CMakeLists.txt和整个项目将正确链接。显然,我不希望工作流程以这种方式工作。

p的代表代码:

cmake_minimum_required(VERSION 2.8)
set(P pexec)
project(${P})
set(P_DIR ${CMAKE_CURRENT_LIST_DIR}/..)
set(P_SRC_DIR ${P_DIR}/src)
set(P_INCLUDE_DIR ${P_DIR}/include)
set(T_PROGRAM_NAME T)
set(T_DIR ${P_DIR}/../Dependencies/T)
set(T_LIB_DIR ${P_DIR}/../Dependencies/T/lib)
set(S_PROGRAM_NAME S)
set(S_DIR ${P_DIR}/../Dependencies/S)
set(S_LIB_DIR ${S_DIR}/lib)
set(BSP_LIB_DIR ${S_DIR}/bsp/architecture/lib)
include(GNUInstallDirs)
include(${S_DIR}/build/build.cmake)
include(${T_DIR}/build/build.cmake)
set(CMAKE_SYSTEM_NAME linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(COMPILER_TOOLS_DIR ${P_DIR}/../Tools/gnu/aarch64/lin/aarch64-linux/bin)
set(CMAKE_C_COMPILER ${COMPILER_TOOLS_DIR}/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${COMPILER_TOOLS_DIR}/aarch64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PTH ${COMPILER_TOOLS_DIR})

set(T_INCLUDE_DIR ${P_DIR}/../Dependencies/T/include)
set(S_INCLUDE_DIR ${P_DIR}/../Dependencies/S/include)
set(BSP_INCLUDE_DIR ${P_DIR}/bsp/architecture/include)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${P_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${P_DIR}/bin)
set(CMAKE_POSITION_INDEPENDENT_CODE on)   
set(CMAKE_CXX_FLAGS "-std=c++11")
set(P_SRCS
*source files*
)
add_executable(${P} ${P_SRCS})
target_include_directories(${P}
PUBLIC ${P_INCLUDE_DIR}
)
target_link_libraries(
${P} 
LINK_PUBLIC
${BSP_LIB_DIR}/libbsp.a
${S_LIB_DIR}/libS.so
dl
pthread
${T_LIB_DIR}/libT.so 
) 
set_target_properties(${P}
PROPERTIES
LINKER_LANGUAGE CXX
PREFIX ""
)

T代码
cmake_minimum_required(VERSION 2.8)
set(T_PROGRAM_NAME tbin)
set(T_DIR ${CMAKE_CURRENT_LIST_DIR}/..)
set(T_INCLUDE_DIR ${T_DIR}/include)
set(T_SRC_DIR ${T_DIR}/src)
set(CMAKE_SYSTEM_NAME linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(COMPILER_TOOLS_DIR ${T_DIR}/../../Tools/gnu/aarch64/lin/aarch64-linux/bin)
set(CMAKE_CXX_COMPILER ${COMPILER_TOOLS_DIR}/aarch64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH ${COMPILER_TOOLS_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${T_DIR}/lib)
set(CMAKE_POSITION_INDEPENDENT_CODE on)   
set(CMAKE_CXX_FLAGS "-std=c++11 -shared")
set(T_SRCS
*source files*
)
set(T_INCLUDES
*header files*
)
include_directories(${T_PROGRAM_NAME}
PUBLIC ${T_INCLUDE_DIR}
)
add_library(${T_PROGRAM_NAME} SHARED ${T_SRCS} ${T_INCLUDES})
target_link_libraries(${T_PROGRAM_NAME} 
pthread
)

S的代码

cmake_minimum_required(VERSION 2.8)
set(S_PROGRAM_NAME sbin)
set(S_DIR ${CMAKE_CURRENT_LIST_DIR}/..)
set(S_INCLUDE_DIR ${S_DIR}/include)
set(S_SRC_DIR ${S_DIR}/src)
set(BSP_LIB_DIR ${S_DIR}/bsp/architecture/lib)
set(CMAKE_SYSTEM_NAME linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(COMPILER_TOOLS_DIR ${S_DIR}/../../Tools/gnu/aarch64/lin/aarch64-linux/bin)
set(CMAKE_C_COMPILER ${COMPILER_TOOLS_DIR}/aarch64-linux-gnu-gcc)
set(CMAKE_FIND_ROOT_PATH ${COMPILER_TOOLS_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${S_DIR}/lib)
set(CMAKE_POSITION_INDEPENDENT_CODE on)
set(CMAKE_C_FLAGS "-shared")
set(S_SRCS
*source files*
)
set(S_INCLUDES
*header files*
)
include_directories(${S_PROGRAM_NAME}
PUBLIC 
${S_INCLUDE_DIR}
${S_DIR}/bsp/architecture/include
)
add_library(${S_PROGRAM_NAME} SHARED ${S_SRCS} ${S_INCLUDES})
target_link_libraries(${S_PROGRAM_NAME} 
${BSP_LIB_DIR}/bsp.a
)
target_include_directories(${S_PROGRAM_NAME}
PUBLIC 
${S_INCLUDE_DIR}
${S_DIR}/bsp/architecture/include
)

最终需要链接到T_PROGRAM_NAME和S_PROGRAM_NAME而不是直接链接到。so文件

最新更新