带cmake的犰狳链接器错误
Linker error with armadillo with cmake
我运行正在使用 Armadillo 教程中的示例
# include <iostream>
# include <armadillo>
using namespace std;
using namespace arma;
int main()
{
mat A = randu<mat>(4,5);
mat B = randu<mat>(4,5);
cout << A*B.t() << endl;
return 0;
}
我已经根据这个
写了一个简短的 CMakeLists.txt
project(DebugTest)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
find_package( ARMADILLO REQUIRED )
include_directories( ${ARMADILLO_INCLUDE_DIR} )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_ARMADILLO_LINK_FLAG}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_ARMADILLO_LINK_FLAG}")
add_executable(main main.cpp)
target_link_libraries( main ${ARMADILLO_LIBRARIES} )
当我从命令行 运行 cmake CMakeLists.txt
后跟 make
时,出现链接器错误。
cmake CMakeLists.txt
的输出
-- The C compiler identification is AppleClang 8.1.0.8020038
-- The CXX compiler identification is AppleClang 8.1.0.8020038
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -- 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/clang
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Armadillo: /usr/local/lib/libarmadillo.dylib (found version "7.800.2")
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/Me/Workspace/DebugTest
make
的输出
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
Undefined symbols for architecture x86_64:
"std::__1::__basic_string_common<true>::__throw_length_error() const", referenced from:
std::__1::enable_if<__is_forward_iterator<char*>::value, void>::type std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init<char*>(char*, char*) in main.cpp.o
"std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in main.cpp.o
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.cpp.o
arma::arma_ostream_state::arma_ostream_state(std::__1::basic_ostream<char, std::__1::char_traits<char> > const&) in main.cpp.o
"std::__1::ios_base::getloc() const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in main.cpp.o
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.cpp.o
arma::arma_ostream_state::arma_ostream_state(std::__1::basic_ostream<char, std::__1::char_traits<char> > const&) in main.cpp.o
"std::logic_error::logic_error(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
void arma::arma_stop_logic_error<char const*>(char const* const&) in main.cpp.o
void arma::arma_stop_logic_error<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main.cpp.o
(... Many many lines skipped ...)
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]: *** [main] Error 1
make[1]: *** [CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2
我确定我的 CMakeLists.txt 是正确的,因为我可以在 QtCreator 中构建项目,而不是在命令行上。
当我使用 QtCreator 构建项目时,一切都按预期运行。 cmake 输出
Running "/usr/local/Cellar/cmake/3.6.1/bin/cmake /Users/Me/Workspace/DebugTest '-GCodeBlocks - Unix Makefiles' -DCMAKE_CXX_COMPILER:STRING=/usr/bin/clang++ -DQT_QMAKE_EXECUTABLE:STRING=" in /Users/Me/Workspace/build-DebugTest-Desktop-Default.
-- The C compiler identification is AppleClang 8.1.0.8020038
-- The CXX compiler identification is AppleClang 8.1.0.8020038
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -- 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: /usr/bin/clang++
-- Check for working CXX compiler: /usr/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/Me/Workspace/DebugTest
CMake Warning:
Manually-specified variables were not used by the project:
QT_QMAKE_EXECUTABLE
编译器输出
17:52:43: Running steps for project DebugTest...
17:52:43: Starting: "/usr/local/Cellar/cmake/3.6.1/bin/cmake" --build . --target all
Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
[100%] Built target main
17:52:45: The process "/usr/local/Cellar/cmake/3.6.1/bin/cmake" exited normally.
17:52:45: Elapsed time: 00:02.
而且 main 方法运行的很漂亮
为什么它在这种情况下有效?
QtCreator 在其 cmake 调用中使用了几个额外的标志
/usr/local/Cellar/cmake/3.6.1/bin/cmake /Users/Me/Workspace/DebugTest '-GCodeBlocks - Unix Makefiles' -DCMAKE_CXX_COMPILER:STRING=/usr/bin/clang++ -DQT_QMAKE_EXECUTABLE:STRING=
我尝试了几个变体,似乎需要 -DCMAKE_CXX_COMPILER:STRING=/usr/bin/clang++
标志才能 link 成功。
命令
cmake CMakeLists.txt -DCMAKE_CXX_COMPILER:STRING=/usr/bin/clang++
make
命令行编译项目成功
我运行正在使用 Armadillo 教程中的示例
# include <iostream>
# include <armadillo>
using namespace std;
using namespace arma;
int main()
{
mat A = randu<mat>(4,5);
mat B = randu<mat>(4,5);
cout << A*B.t() << endl;
return 0;
}
我已经根据这个
写了一个简短的 CMakeLists.txtproject(DebugTest)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
find_package( ARMADILLO REQUIRED )
include_directories( ${ARMADILLO_INCLUDE_DIR} )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_ARMADILLO_LINK_FLAG}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_ARMADILLO_LINK_FLAG}")
add_executable(main main.cpp)
target_link_libraries( main ${ARMADILLO_LIBRARIES} )
当我从命令行 运行 cmake CMakeLists.txt
后跟 make
时,出现链接器错误。
cmake CMakeLists.txt
-- The C compiler identification is AppleClang 8.1.0.8020038
-- The CXX compiler identification is AppleClang 8.1.0.8020038
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -- 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/clang
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Armadillo: /usr/local/lib/libarmadillo.dylib (found version "7.800.2")
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/Me/Workspace/DebugTest
make
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
Undefined symbols for architecture x86_64:
"std::__1::__basic_string_common<true>::__throw_length_error() const", referenced from:
std::__1::enable_if<__is_forward_iterator<char*>::value, void>::type std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init<char*>(char*, char*) in main.cpp.o
"std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in main.cpp.o
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.cpp.o
arma::arma_ostream_state::arma_ostream_state(std::__1::basic_ostream<char, std::__1::char_traits<char> > const&) in main.cpp.o
"std::__1::ios_base::getloc() const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in main.cpp.o
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main.cpp.o
arma::arma_ostream_state::arma_ostream_state(std::__1::basic_ostream<char, std::__1::char_traits<char> > const&) in main.cpp.o
"std::logic_error::logic_error(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
void arma::arma_stop_logic_error<char const*>(char const* const&) in main.cpp.o
void arma::arma_stop_logic_error<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main.cpp.o
(... Many many lines skipped ...)
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]: *** [main] Error 1
make[1]: *** [CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2
我确定我的 CMakeLists.txt 是正确的,因为我可以在 QtCreator 中构建项目,而不是在命令行上。
当我使用 QtCreator 构建项目时,一切都按预期运行。 cmake 输出
Running "/usr/local/Cellar/cmake/3.6.1/bin/cmake /Users/Me/Workspace/DebugTest '-GCodeBlocks - Unix Makefiles' -DCMAKE_CXX_COMPILER:STRING=/usr/bin/clang++ -DQT_QMAKE_EXECUTABLE:STRING=" in /Users/Me/Workspace/build-DebugTest-Desktop-Default.
-- The C compiler identification is AppleClang 8.1.0.8020038
-- The CXX compiler identification is AppleClang 8.1.0.8020038
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -- 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: /usr/bin/clang++
-- Check for working CXX compiler: /usr/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/Me/Workspace/DebugTest
CMake Warning:
Manually-specified variables were not used by the project:
QT_QMAKE_EXECUTABLE
编译器输出
17:52:43: Running steps for project DebugTest...
17:52:43: Starting: "/usr/local/Cellar/cmake/3.6.1/bin/cmake" --build . --target all
Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
[100%] Built target main
17:52:45: The process "/usr/local/Cellar/cmake/3.6.1/bin/cmake" exited normally.
17:52:45: Elapsed time: 00:02.
而且 main 方法运行的很漂亮
为什么它在这种情况下有效?
QtCreator 在其 cmake 调用中使用了几个额外的标志
/usr/local/Cellar/cmake/3.6.1/bin/cmake /Users/Me/Workspace/DebugTest '-GCodeBlocks - Unix Makefiles' -DCMAKE_CXX_COMPILER:STRING=/usr/bin/clang++ -DQT_QMAKE_EXECUTABLE:STRING=
我尝试了几个变体,似乎需要 -DCMAKE_CXX_COMPILER:STRING=/usr/bin/clang++
标志才能 link 成功。
命令
cmake CMakeLists.txt -DCMAKE_CXX_COMPILER:STRING=/usr/bin/clang++
make
命令行编译项目成功