2017-07-20 13 views
0

私は、この問題を克服して、私が分かりかねるまで、私はcmakeをかなりよく理解していると思った。私はCで静的ライブラリを構築しましたが、C++で単体テストを実行しようとしていますが、そのライブラリの静的関数のいずれにもリンクできないようです。cmakeのC libにC++ exeをリンクする

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); 
} 

はその後、私の出力は次のようになります。

$ make 
Scanning dependencies of target mylib 
[ 25%] Building C object CMakeFiles/mylib.dir/mylib.c.o 
[ 50%] Linking C static library libmylib.a 
[ 50%] Built target mylib 
Scanning dependencies of target mytestapp 
[ 75%] Building CXX object CMakeFiles/mytestapp.dir/mytest.cpp.o 
[100%] Linking CXX executable mytestapp 
CMakeFiles/mytestapp.dir/mytest.cpp.o: In function `mylib_test::test_method()': 
mytest.cpp:(.text+0x1e411): undefined reference to `add(int, int)' 
collect2: error: ld returned 1 exit status 
make[2]: *** [CMakeFiles/mytestapp.dir/build.make:96: mytestapp] Error 1 
make[1]: *** [CMakeFiles/Makefile2:105: CMakeFiles/mytestapp.dir/all] Error 2 
make: *** [Makefile:95: all] Error 2 

私はC++でmylibをコンパイルする場合、それは罰金リンクが、私はCでの巨大なライブラリを持っているので、ないCのそれは私のための問題だと私はしようとしていますboost_test_framework(C++で)を使用してこのlibをロードしてテストします。

+0

可能な複製を( https://stackoverflow.com/questions/12573816/what-is-an-undef-reference-unresolved-external-symbol-error-and-how-do-i-fix) – Olaf

+0

重複していない問題は、言語。私がC++でeverytrhingをしてもうまく動作します。そしてなぜdownvote? – Stewart

+0

明らかに重複しています。理由と答えを理解できない場合は、いくつかの調査を行う必要があります。私たちは教習やデバッグのサービスではありません。そしてそれは言語CやC++とは関係なく、リンクしています。タグをスパムしないでください。 – Olaf

答えて

0

ソリューション:私はそうのよう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); 
} 
関連する問題