Я работаю над простым проектом C++, и я хотел использовать модульное тестирование, в частности googletest. Для начала я основал структуру своего проекта на https://github.com/snikulov/google-test-examples. Когда я клонировал его и тестировал, он работал отлично. Затем я переехал необходимые компоненты для моего проекта, и я получаю следующее сообщение об ошибке компоновщика:googletest & cmake - Неопределенные символы для архитектуры x86_64
Undefined symbols for architecture x86_64:
"Vector::Vector(int, float*)", referenced from:
cpp_vector_test_vector_operator_adder_Test::TestBody() in cpp_vector_test.cc.o
"Vector::~Vector()", referenced from:
cpp_vector_test_vector_operator_adder_Test::TestBody() in cpp_vector_test.cc.o
"Vector::operator==(Vector)", referenced from:
cpp_vector_test_vector_operator_adder_Test::TestBody() in cpp_vector_test.cc.o
"Vector::operator+(Vector)", referenced from:
cpp_vector_test_vector_operator_adder_Test::TestBody() in cpp_vector_test.cc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
я работал через это в течение нескольких часов в день или два между ними и не имел никакой удачи. Мой проект можно найти по адресу https://github.com/bi3mer/Bragi. Я играл вокруг с конфигурацией Cmake некоторое время я попытался запустить CMake так:
cmake -DBUILD_SHARED_LIBS=ON ..
и регулярное:
cmake ..
Особенно странным отметить, что бросает меня в том, что если У меня есть свой тестовый код:
#include "Vector.h"
#include "gtest/gtest.h"
TEST(cpp_vector_test, vector_operator_adder)
{
EXPECT_EQ(true, true);
}
Он будет работать нормально. Только однажды я пытаюсь создать экземпляр класса, чтобы произошла ошибка.
#include "Vector.h"
#include "gtest/gtest.h"
TEST(cpp_vector_test, vector_operator_adder)
{
Vector test = Vector(3); // throws error
EXPECT_EQ(true, true);
}
Я также смотрел другие темы, такие как gtest: Undefined symbols for architecture x86_64 error with clang++ and std::vector, но я понятия не имею, где настроечный скрипт откуда.
Основываясь на всем, что я нашел, похоже, что происходит несоответствие компилятора, я просто не уверен, как исправить это на основе всего, что я прочитал.
Я надеюсь, что вы можете помочь, чтобы клонировать:
git clone https://github.com/bi3mer/Bragi.git
Я полагаю, что это проще, чем наклеивать в файлах и everying. Надеюсь, вы можете помочь, я включил вывод, когда пытаюсь построить ниже. Спасибо вам за помощь.
./build.sh
-- The C compiler identification is AppleClang 8.0.0.8000042
-- The CXX compiler identification is AppleClang 8.0.0.8000042
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/colan/Documents/work/Bragi/build
Scanning dependencies of target googletest
[ 10%] Creating directories for 'googletest'
[ 20%] Performing download step (git clone) for 'googletest'
Cloning into 'googletest'...
Already on 'master'
Your branch is up-to-date with 'origin/master'.
[ 30%] No patch step for 'googletest'
[ 40%] Performing update step for 'googletest'
Current branch master is up to date.
[ 50%] Performing configure step for 'googletest'
-- The C compiler identification is AppleClang 8.0.0.8000042
-- The CXX compiler identification is AppleClang 8.0.0.8000042
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PythonInterp: //anaconda/bin/python (found version "2.7.12")
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE
-- Build files have been written to: /Users/colan/Documents/work/Bragi/build/ext/gtest/src/googletest-build
[ 60%] Performing build step for 'googletest'
Scanning dependencies of target gmock
[ 9%] Building CXX object googlemock/CMakeFiles/gmock.dir/__/googletest/src/gtest-all.cc.o
[ 18%] Building CXX object googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.o
[ 27%] Linking CXX static library libgmock.a
[ 27%] Built target gmock
Scanning dependencies of target gmock_main
[ 36%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/__/googletest/src/gtest-all.cc.o
[ 45%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/src/gmock-all.cc.o
[ 54%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.o
[ 63%] Linking CXX static library libgmock_main.a
[ 63%] Built target gmock_main
Scanning dependencies of target gtest
[ 72%] Building CXX object googlemock/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
[ 81%] Linking CXX static library libgtest.a
[ 81%] Built target gtest
Scanning dependencies of target gtest_main
[ 90%] Building CXX object googlemock/gtest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
[100%] Linking CXX static library libgtest_main.a
[100%] Built target gtest_main
[ 70%] No install step for 'googletest'
[ 80%] Completed 'googletest'
[ 80%] Built target googletest
Scanning dependencies of target Bragi_test
[ 90%] Building CXX object CMakeFiles/Bragi_test.dir/test/cpp_vector_test.cc.o
[100%] Linking CXX executable Bragi_test
Undefined symbols for architecture x86_64:
"Vector::Vector(int, float*)", referenced from:
cpp_vector_test_vector_operator_adder_Test::TestBody() in cpp_vector_test.cc.o
"Vector::~Vector()", referenced from:
cpp_vector_test_vector_operator_adder_Test::TestBody() in cpp_vector_test.cc.o
"Vector::operator==(Vector)", referenced from:
cpp_vector_test_vector_operator_adder_Test::TestBody() in cpp_vector_test.cc.o
"Vector::operator+(Vector)", referenced from:
cpp_vector_test_vector_operator_adder_Test::TestBody() in cpp_vector_test.cc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [Bragi_test] Error 1
make[1]: *** [CMakeFiles/Bragi_test.dir/all] Error 2
make: *** [all] Error 2
UpdateCTestConfiguration from :/Users/colan/Documents/work/Bragi/build/DartConfiguration.tcl
UpdateCTestConfiguration from :/Users/colan/Documents/work/Bragi/build/DartConfiguration.tcl
Test project /Users/colan/Documents/work/Bragi/build
Constructing a list of tests
Done constructing a list of tests
Updating test list for fixtures
Added 0 tests to meet fixture requirements
Checking test dependency graph...
Checking test dependency graph end
test 1
Start 1: test1
Could not find executable Bragi_test
Looked in the following places:
Bragi_test
Bragi_test
Release/Bragi_test
Release/Bragi_test
Debug/Bragi_test
Debug/Bragi_test
MinSizeRel/Bragi_test
MinSizeRel/Bragi_test
RelWithDebInfo/Bragi_test
RelWithDebInfo/Bragi_test
Deployment/Bragi_test
Deployment/Bragi_test
Development/Bragi_test
Development/Bragi_test
1: Test command:
Unable to find executable: Bragi_test
1/1 Test #1: test1 ............................***Not Run 0.00 sec
0% tests passed, 1 tests failed out of 1
Total Test time (real) = 0.00 sec
The following tests FAILED:
1 - test1 (Not Run)
Errors while running CTest
Я не могу найти ссылку на src/Vector.cpp в любом месте вашего CMakeLists.txt. Это зависит от вашего теста. – Frank
@Frank Я играл с https://github.com/bi3mer/Bragi/blob/master/CMakeLists.txt#L27, но мне не удалось найти способ правильно его запустить в проект. Я также заметил, что файл в каталоге src пуст в примере теста Google, который я использовал, поэтому это определенно выглядит как подходящее место для поиска. –