CMake 不链接 C 和 C++ 静态库(未定义对函数的引用)

CMake doesn't link C and C++ static libraries (undefined reference to function)

本文关键字:未定义 函数 引用 链接 静态 C++ CMake      更新时间:2023-10-16

我试图重现最小的问题。当我在Ubuntu上运行CMake+Make时,我得到错误

funccpp.cpp:(.text+0x5): undefined reference to `FuncC'

即在C++库中导入时找不到C库中导出的函数。当我尝试使用g++ main.cpp funcc.c funccpp.cpp手动编译时,它成功地编译了最终程序。如何解决CMake问题?

作为参考,当我运行nm libfuncc_lib.a时,我会得到行T FuncC(因此符号是外部的,在Text部分中定义(,当我执行nm libfunccpp_lib.a时,我得到U FuncC(因此符号未定义,应该从外部链接(。

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Test C CXX)
set (SRC_CPP funccpp.cpp)
set (SRC_C funcc.c)
set (SRC_MAIN main.cpp)
add_library(funcc_lib STATIC ${SRC_C})
add_library(funccpp_lib STATIC ${SRC_CPP})
add_executable(prog ${SRC_MAIN})
target_link_libraries(prog funcc_lib funccpp_lib)

main.cpp

#include "funccpp.h"
int main() {
FuncCPP();
return 0;
}

funccpp.h

#ifndef FUNCCPP_H
#define FUNCCPP_H
void FuncCPP();
#endif

funccpp.cpp

#include "funcc.h"
void FuncCPP() {
FuncC();
}

函数h

#ifndef FUNCC_H
#define FUNCC_H
#ifdef __cplusplus
extern "C" {
#endif
void FuncC();
#ifdef __cplusplus
}
#endif
#endif // FUNCC_H

函数c

#include "funcc.h"
#include <stdio.h>
void FuncC() {
printf("Hello, World!n");
}

这里的问题是,链接器依赖于库的顺序。带

target_link_libraries(prog funcc_lib funccpp_lib)

它首先链接funcc_lib,然后链接funccpp_lib。但它永远不会回到funcc_lib。由于funccpp_lib依赖于funcc_lib,因此必须更改库的顺序:

target_link_libraries(prog funccpp_lib funcc_lib)

有关其他信息,请参阅本讨论。

将cmake c link命令作为c++命令将解决问题

SET(CMAKE_C_LINK_EXECUTABLE ${CMAKE_CXX_LINK_EXECUTABLE})