链接一个C++;exe到cmake中的C库

链接一个C++;exe到cmake中的C库,cmake,linker,Cmake,Linker,我以为我很了解cmake,直到我遇到了这个我无法解决的问题。我在C中构建了一个静态库,我试图在C++中运行它的单元测试,但是我不能链接到那个库中的任何静态函数,我不知道为什么。我在下面的框架项目中重现了这个问题: CMakeLists.txt: cmake_minimum_required(VERSION 3.6) project(myproj) add_library(mylib STATIC mylib.c) find_package(Boost 1.64.0 COMPONENTS

我以为我很了解cmake,直到我遇到了这个我无法解决的问题。我在C中构建了一个静态库,我试图在C++中运行它的单元测试,但是我不能链接到那个库中的任何静态函数,我不知道为什么。我在下面的框架项目中重现了这个问题:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.6) 
project(myproj) 

add_library(mylib STATIC mylib.c) 

find_package(Boost 1.64.0 COMPONENTS unit_test_framework) 

add_executable(mytestapp mytest.cpp) 
target_include_directories(mytestapp PRIVATE .) 
target_link_libraries(mytestapp mylib) 

enable_testing() 
add_test( mytest mytestapp)
mylib.c:

int add(int a, int b)
{
    return a + b;
}
mylib.h

int add(int a, int b);
mytest.cpp:

#define BOOST_TEST_MODULE mylib_test
#include <boost/test/included/unit_test.hpp>
#include "mylib.h"

BOOST_AUTO_TEST_CASE(mylib_test)
{
    BOOST_TEST( add(2,2) == 4);
}
<>如果我在C++ C++中编译了<代码> MyLIB < /C>,它链接得很好,但是C中没有。这是个问题,因为我在C中有一个巨大的库,我想用BooStyTestGrand框架(C++)加载这个LIB并测试它。

解决方案:

我需要使用
extern“C”
导入库,如下所示:

#define BOOST_TEST_MODULE mylib_test
#include <boost/test/included/unit_test.hpp>

extern "C" {
  #include "mylib.h"
}

BOOST_AUTO_TEST_CASE(mylib_test)
{
    BOOST_TEST( add(2,2) == 4);
}
#定义BOOST_TEST_模块mylib_TEST
#包括
外部“C”{
#包括“mylib.h”
}
增压自动测试案例(mylib测试)
{
升压试验(加(2,2)==4);
}

可能的重复不是重复,问题是跨语言。如果我在C++中做所有的事情,效果就很好。为什么否决票?显然是重复的。如果你不明白原因和答案,你应该做一些研究。我们不是辅导或调试服务。这与C语言和C++语言无关,而是联系。不要垃圾邮件标签。这就是为什么我把它分解成一个简单的框架来准确地解释这个问题。一般来说,我理解链接器错误,但我不明白为什么C++ LIB不能加载C函数。我已经用C和C++ Objo混合了很多项目,DLL之间的接口经常在C中。嗯,你可能是对的。这是一个C++问题,但不是C问题。我非常肯定,每一本C++书籍都解释了如何使用C标题。还要仔细阅读错误消息并进行一些研究。我取消了简历,但由于这是一个明显的错误,我将根据给出的提示保留它。
#define BOOST_TEST_MODULE mylib_test
#include <boost/test/included/unit_test.hpp>

extern "C" {
  #include "mylib.h"
}

BOOST_AUTO_TEST_CASE(mylib_test)
{
    BOOST_TEST( add(2,2) == 4);
}