首页 > 解决方案 > CMake 不链接 C 和 C++ 静态库(未定义对函数的引用)

问题描述

我试图重现最小的问题。当我在 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(所以符号是外部的并在文本部分定义),当我运行时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)

主文件

#include "funccpp.h"

int main() {
    FuncCPP();
    return 0;
}

funcpp.h

#ifndef FUNCCPP_H
#define FUNCCPP_H

void FuncCPP();

#endif

funcpp.cpp

#include "funcc.h"

void FuncCPP() {
    FuncC();
}

函数库

#ifndef FUNCC_H
#define FUNCC_H

#ifdef __cplusplus
extern "C" {
#endif

void FuncC();

#ifdef __cplusplus
}
#endif

#endif // FUNCC_H

函数cc

#include "funcc.h"
#include <stdio.h>

void FuncC() {
    printf("Hello, World!\n");
}

标签: c++ccmake

解决方案


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

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)

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


推荐阅读