获取架构 arm64 错误的未定义符号
Getting undefined symbols for architecture arm64 error
我在 M1 Pro Mac (CLion) 上构建,编译时出现以下错误:
FAILED: tree
: && /Library/Developer/CommandLineTools/usr/bin/c++ -g -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.0.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/tree.dir/main.cpp.o CMakeFiles/tree.dir/Node.cpp.o CMakeFiles/tree.dir/Tree.cpp.o CMakeFiles/tree.dir/Unit.cpp.o -o tree && :
Undefined symbols for architecture arm64:
"Node<Unit>::addRoot(Unit)", referenced from:
_main in main.cpp.o
"Node<Unit>::Node()", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
我有三个 classes,Node
、Tree
和 Unit
。我遇到的大多数 post 表明其中一个文件未包含在项目中(例如 )。我怀疑这是问题所在,因为它们似乎都包含在编译器行中。
我的 CMakeLists.txt
看起来像这样:
cmake_minimum_required(VERSION 3.21)
project(tree)
set(CMAKE_CXX_STANDARD 14)
add_executable(tree main.cpp Node.cpp Node.h Tree.cpp Tree.h Unit.cpp Unit.h)
我正在添加 Unit
class 的头文件,因为这似乎是冒犯编译器的头文件,但我怀疑这就是问题所在。猜猜这是一些 make 文件设置?
#include <iostream>
#include <vector>
using namespace std;
template <class T>
class Node {
weak_ptr<Node> parent;
vector<shared_ptr<shared_ptr<Node>>> children;
T data;
public:
Node();
Node(weak_ptr<Node> parent, T &data);
void addRoot(T node_data);
};
在这个 post 中可能过于冗长,这里是 CMakeError.log
输出:
Compiling the C compiler identification source file "CMakeCCompilerId.c" failed.
Compiler: /Library/Developer/CommandLineTools/usr/bin/cc
Build flags:
Id flags:
The output was:
1
ld: library not found for -lSystem
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed.
Compiler: /Library/Developer/CommandLineTools/usr/bin/c++
Build flags:
Id flags:
The output was:
1
ld: library not found for -lc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)
输出如果我运行 c++ main.cpp Node.cpp Tree.cpp Unit.cpp
:
In file included from main.cpp:3:
./Node.h:16:38: error: a space is required between consecutive right angle brackets (use '> >')
vector<shared_ptr<shared_ptr<Node>>> children;
^~
> >
main.cpp:7:5: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
auto unit = std::make_unique<Unit>(1, "Test Unit");
^
main.cpp:7:22: error: no member named 'make_unique' in namespace 'std'
auto unit = std::make_unique<Unit>(1, "Test Unit");
~~~~~^
main.cpp:7:34: error: 'Unit' does not refer to a value
auto unit = std::make_unique<Unit>(1, "Test Unit");
^
./Unit.h:11:7: note: declared here
class Unit {
^
main.cpp:7:40: warning: expression result unused [-Wunused-value]
auto unit = std::make_unique<Unit>(1, "Test Unit");
^
main.cpp:8:20: error: expected ';' at end of declaration
Node<Unit> node {};
^
;
2 warnings and 4 errors generated.
In file included from Node.cpp:5:
./Node.h:16:38: error: a space is required between consecutive right angle brackets (use '> >')
vector<shared_ptr<shared_ptr<Node>>> children;
^~
> >
1 error generated.
我是 C++ 的新手,所以我发现这个问题有点难以追踪。
您似乎在使用模板时遇到了问题。在模板化 classes 中,您必须将方法的实现全部放在 header 文件中,或者在 cpp body 中对具体 classes 进行显式模板实例化定义它。
举个例子更容易理解。在下面的例子中,我在 header 中添加了构造函数的 body 所以我不需要做任何其他事情
/////////////////////////////////////////
// In Node.h
/////////////////////////////////////////
template< typename T >
struct Node {
Node();
};
template< typename T >
Node<T>::Node() {
}
/////////////////////////////////////////
// In Node.cpp
/////////////////////////////////////////
// (nothing)
/////////////////////////////////////////
// Int main.cpp
/////////////////////////////////////////
#include "Node.h"
int main() {
Node<int> n;
}
在第二种情况下,我将在 Node.cpp 的 body 中对具体的 class Node<int>
进行显式模板实例化,这样我就不需要公开模板化 classes.
的实现
/////////////////////////////////////////
// In Node.h
/////////////////////////////////////////
template< typename T >
struct Node {
Node();
};
/////////////////////////////////////////
// In Node.cpp
/////////////////////////////////////////
template< typename T >
Node<T>::Node() {}
// Explicit initialization
template struct Node<int>;
/////////////////////////////////////////
// Int main.cpp
/////////////////////////////////////////
#include "Node.h"
int main() {
Node<int> n;
}
我更喜欢使用第二种方法,因为它可以显着缩短构建时间。
我在 M1 Pro Mac (CLion) 上构建,编译时出现以下错误:
FAILED: tree
: && /Library/Developer/CommandLineTools/usr/bin/c++ -g -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.0.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/tree.dir/main.cpp.o CMakeFiles/tree.dir/Node.cpp.o CMakeFiles/tree.dir/Tree.cpp.o CMakeFiles/tree.dir/Unit.cpp.o -o tree && :
Undefined symbols for architecture arm64:
"Node<Unit>::addRoot(Unit)", referenced from:
_main in main.cpp.o
"Node<Unit>::Node()", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
我有三个 classes,Node
、Tree
和 Unit
。我遇到的大多数 post 表明其中一个文件未包含在项目中(例如
我的 CMakeLists.txt
看起来像这样:
cmake_minimum_required(VERSION 3.21)
project(tree)
set(CMAKE_CXX_STANDARD 14)
add_executable(tree main.cpp Node.cpp Node.h Tree.cpp Tree.h Unit.cpp Unit.h)
我正在添加 Unit
class 的头文件,因为这似乎是冒犯编译器的头文件,但我怀疑这就是问题所在。猜猜这是一些 make 文件设置?
#include <iostream>
#include <vector>
using namespace std;
template <class T>
class Node {
weak_ptr<Node> parent;
vector<shared_ptr<shared_ptr<Node>>> children;
T data;
public:
Node();
Node(weak_ptr<Node> parent, T &data);
void addRoot(T node_data);
};
在这个 post 中可能过于冗长,这里是 CMakeError.log
输出:
Compiling the C compiler identification source file "CMakeCCompilerId.c" failed.
Compiler: /Library/Developer/CommandLineTools/usr/bin/cc
Build flags:
Id flags:
The output was:
1
ld: library not found for -lSystem
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed.
Compiler: /Library/Developer/CommandLineTools/usr/bin/c++
Build flags:
Id flags:
The output was:
1
ld: library not found for -lc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)
输出如果我运行 c++ main.cpp Node.cpp Tree.cpp Unit.cpp
:
In file included from main.cpp:3:
./Node.h:16:38: error: a space is required between consecutive right angle brackets (use '> >')
vector<shared_ptr<shared_ptr<Node>>> children;
^~
> >
main.cpp:7:5: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
auto unit = std::make_unique<Unit>(1, "Test Unit");
^
main.cpp:7:22: error: no member named 'make_unique' in namespace 'std'
auto unit = std::make_unique<Unit>(1, "Test Unit");
~~~~~^
main.cpp:7:34: error: 'Unit' does not refer to a value
auto unit = std::make_unique<Unit>(1, "Test Unit");
^
./Unit.h:11:7: note: declared here
class Unit {
^
main.cpp:7:40: warning: expression result unused [-Wunused-value]
auto unit = std::make_unique<Unit>(1, "Test Unit");
^
main.cpp:8:20: error: expected ';' at end of declaration
Node<Unit> node {};
^
;
2 warnings and 4 errors generated.
In file included from Node.cpp:5:
./Node.h:16:38: error: a space is required between consecutive right angle brackets (use '> >')
vector<shared_ptr<shared_ptr<Node>>> children;
^~
> >
1 error generated.
我是 C++ 的新手,所以我发现这个问题有点难以追踪。
您似乎在使用模板时遇到了问题。在模板化 classes 中,您必须将方法的实现全部放在 header 文件中,或者在 cpp body 中对具体 classes 进行显式模板实例化定义它。
举个例子更容易理解。在下面的例子中,我在 header 中添加了构造函数的 body 所以我不需要做任何其他事情
/////////////////////////////////////////
// In Node.h
/////////////////////////////////////////
template< typename T >
struct Node {
Node();
};
template< typename T >
Node<T>::Node() {
}
/////////////////////////////////////////
// In Node.cpp
/////////////////////////////////////////
// (nothing)
/////////////////////////////////////////
// Int main.cpp
/////////////////////////////////////////
#include "Node.h"
int main() {
Node<int> n;
}
在第二种情况下,我将在 Node.cpp 的 body 中对具体的 class Node<int>
进行显式模板实例化,这样我就不需要公开模板化 classes.
/////////////////////////////////////////
// In Node.h
/////////////////////////////////////////
template< typename T >
struct Node {
Node();
};
/////////////////////////////////////////
// In Node.cpp
/////////////////////////////////////////
template< typename T >
Node<T>::Node() {}
// Explicit initialization
template struct Node<int>;
/////////////////////////////////////////
// Int main.cpp
/////////////////////////////////////////
#include "Node.h"
int main() {
Node<int> n;
}
我更喜欢使用第二种方法,因为它可以显着缩短构建时间。