Linker error: undefined reference to `Reference_Genome::seq[abi:cxx11]'
Linker error: undefined reference to `Reference_Genome::seq[abi:cxx11]'
我是 c 和 c++ 的新手,所以请尝试更具体地解释我应该做什么。该程序尝试使用多线程从目录中读取文件,并将信息存储在映射中,以便以后使用。
我一直在寻找类似的帖子。但是,我想不通。
在 https://github.com/kaldi-asr/kaldi/issues/938 中,它说“如果您收到 linker 错误,关于未定义的符号引用涉及 std::__cxx11 命名空间或标记 [abi:cxx11] 中的类型那么它可能表明您正在尝试 link 将使用 _GLIBCXX_USE_CXX11_ABI 宏的不同值编译的目标文件放在一起。"
undefined reference to `pthread_cancel'的解决方案(添加“-pthread”标志也不起作用。
我的密码是
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <map>
#include <algorithm>
#include <random>
#include <unistd.h>
#include <cmath>
#include <stdlib.h>
#include <mutex>
#include <sys/wait.h>
#include <filesystem>
#include <string>
#include <pthread.h>
#define time_str(s) (s < 60 ? (to_string(s) + " second(s)") : (s < 3600 ? (to_string((s) / 60) + " minute(s)") : (to_string((s) / 3600) + " hour(s) and " + to_string(((s) % 3600) / 60) + " minute(s)")))
using namespace std;
namespace fs = std::filesystem;
struct MyGenom
{
vector<string> filepaths;
map<string, string> seq;
};
void check_rv(int rv) {
if (rv != 0) {
printf("Error: Value is %d\n", rv);
exit(1);
}
}
struct Reference_Genome {
static long unsigned int idx;
static map <string, string> seq;
static pthread_mutex_t mtxLock;
static vector <string> filepaths;
static void writing(string path) {
}
static void *distribution(void *var) {
}
Reference_Genome(string dir, unsigned int n_threads) {
}
};
int main(int argc, char const *argv[]) {
string dir = "./data/ex_seq";
unsigned int n_threads = 5;
Reference_Genome ref(dir, n_threads);
cout << "chr6: " << ref.seq["chr6"] << endl;
cout << "chr9: " << ref.seq["chr9"] << endl;
cout << "chr13: " << ref.seq["chr13"] << endl;
}
gcc 版本为“线程模型:posix
gcc 版本 9.3.0 (Ubuntu 9.3.0-10ubuntu2)".
错误是
testSeq.cpp:97: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:98: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:99: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: /tmp/cctfwVX2.o: in function `Reference_Genome::writing(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
/testSeq.cpp:46: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:48: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: /tmp/cctfwVX2.o: in function `Reference_Genome::distribution(void*)':
testSeq.cpp:55: undefined reference to `Reference_Genome::filepaths[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:55: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:56: undefined reference to `Reference_Genome::mtxLock'
/usr/bin/ld: testSeq.cpp:57: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:57: undefined reference to `Reference_Genome::filepaths[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:58: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:58: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:59: undefined reference to `Reference_Genome::mtxLock'
/usr/bin/ld: /tmp/cctfwVX2.o: in function `Reference_Genome::Reference_Genome(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)':
testSeq.cpp:68: undefined reference to `Reference_Genome::filepaths[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:70: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:72: undefined reference to `Reference_Genome::mtxLock'
/usr/bin/ld: testSeq.cpp:85: undefined reference to `Reference_Genome::mtxLock'
/usr/bin/ld: testSeq.cpp:88: undefined reference to `Reference_Genome::filepaths[abi:cxx11]'
collect2: error: ld returned 1 exit status
当您在 class 内声明静态变量时,您还必须在 class 外声明一次。在这种情况下,您可以将其放在 C++ 文件的底部或 main()
函数和 class Reference_Genome
定义之间:
long unsigned int Reference_Genome::idx;
map <string, string> Reference_Genome::seq;
pthread_mutex_t Reference_Genome::mtxLock;
vector <string> Reference_Genome::filepaths;
想法是,您可以将 class 定义放在一个头文件中,以包含在多个不同的编译单元中,但静态变量只定义一次,在您选择的一个 .cpp 文件中.
我是 c 和 c++ 的新手,所以请尝试更具体地解释我应该做什么。该程序尝试使用多线程从目录中读取文件,并将信息存储在映射中,以便以后使用。
我一直在寻找类似的帖子。但是,我想不通。
在 https://github.com/kaldi-asr/kaldi/issues/938 中,它说“如果您收到 linker 错误,关于未定义的符号引用涉及 std::__cxx11 命名空间或标记 [abi:cxx11] 中的类型那么它可能表明您正在尝试 link 将使用 _GLIBCXX_USE_CXX11_ABI 宏的不同值编译的目标文件放在一起。"
undefined reference to `pthread_cancel'的解决方案(添加“-pthread”标志也不起作用。
我的密码是
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <map>
#include <algorithm>
#include <random>
#include <unistd.h>
#include <cmath>
#include <stdlib.h>
#include <mutex>
#include <sys/wait.h>
#include <filesystem>
#include <string>
#include <pthread.h>
#define time_str(s) (s < 60 ? (to_string(s) + " second(s)") : (s < 3600 ? (to_string((s) / 60) + " minute(s)") : (to_string((s) / 3600) + " hour(s) and " + to_string(((s) % 3600) / 60) + " minute(s)")))
using namespace std;
namespace fs = std::filesystem;
struct MyGenom
{
vector<string> filepaths;
map<string, string> seq;
};
void check_rv(int rv) {
if (rv != 0) {
printf("Error: Value is %d\n", rv);
exit(1);
}
}
struct Reference_Genome {
static long unsigned int idx;
static map <string, string> seq;
static pthread_mutex_t mtxLock;
static vector <string> filepaths;
static void writing(string path) {
}
static void *distribution(void *var) {
}
Reference_Genome(string dir, unsigned int n_threads) {
}
};
int main(int argc, char const *argv[]) {
string dir = "./data/ex_seq";
unsigned int n_threads = 5;
Reference_Genome ref(dir, n_threads);
cout << "chr6: " << ref.seq["chr6"] << endl;
cout << "chr9: " << ref.seq["chr9"] << endl;
cout << "chr13: " << ref.seq["chr13"] << endl;
}
gcc 版本为“线程模型:posix gcc 版本 9.3.0 (Ubuntu 9.3.0-10ubuntu2)".
错误是
testSeq.cpp:97: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:98: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:99: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: /tmp/cctfwVX2.o: in function `Reference_Genome::writing(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
/testSeq.cpp:46: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:48: undefined reference to `Reference_Genome::seq[abi:cxx11]'
/usr/bin/ld: /tmp/cctfwVX2.o: in function `Reference_Genome::distribution(void*)':
testSeq.cpp:55: undefined reference to `Reference_Genome::filepaths[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:55: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:56: undefined reference to `Reference_Genome::mtxLock'
/usr/bin/ld: testSeq.cpp:57: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:57: undefined reference to `Reference_Genome::filepaths[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:58: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:58: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:59: undefined reference to `Reference_Genome::mtxLock'
/usr/bin/ld: /tmp/cctfwVX2.o: in function `Reference_Genome::Reference_Genome(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)':
testSeq.cpp:68: undefined reference to `Reference_Genome::filepaths[abi:cxx11]'
/usr/bin/ld: testSeq.cpp:70: undefined reference to `Reference_Genome::idx'
/usr/bin/ld: testSeq.cpp:72: undefined reference to `Reference_Genome::mtxLock'
/usr/bin/ld: testSeq.cpp:85: undefined reference to `Reference_Genome::mtxLock'
/usr/bin/ld: testSeq.cpp:88: undefined reference to `Reference_Genome::filepaths[abi:cxx11]'
collect2: error: ld returned 1 exit status
当您在 class 内声明静态变量时,您还必须在 class 外声明一次。在这种情况下,您可以将其放在 C++ 文件的底部或 main()
函数和 class Reference_Genome
定义之间:
long unsigned int Reference_Genome::idx;
map <string, string> Reference_Genome::seq;
pthread_mutex_t Reference_Genome::mtxLock;
vector <string> Reference_Genome::filepaths;
想法是,您可以将 class 定义放在一个头文件中,以包含在多个不同的编译单元中,但静态变量只定义一次,在您选择的一个 .cpp 文件中.