gpt4 book ai didi

linux - 使用模板使用 g++ -std=c++11 创建静态库

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:43 25 4
gpt4 key购买 nike

在使用 C++11 创建静态库时,我认为它在链接期间失败了。

我可以创建一个静态库并使用 How to create a static library with g++? 中的信息链接到它使用普通的 c++,但如果我尝试使用 c++11 功能执行这些步骤,它会在链接过程中失败。

测试.cpp:

#include <iostream>
#include <vector>
#include "libtestlib.h"
using namespace std;

int main() {
itest n1={{1,2,3,4},
{5,6,7,8},
{9,0,1,2}};

cout << "testing...\n";
test_print(n1);

return 0;
}

libteSTLib.h:

#ifndef testlib
#define testlib

#include <vector>
using namespace std;

typedef vector<vector<double>> dtest;
typedef vector<vector<int>> itest;

template <typename testtype>
void test_print(testtype);

#endif

libteSTLib.cpp:

#include <iostream>
#include "libtestlib.h"
using namespace std;

template <typename testtype>
void test_print(testtype &t)
{
int m=t.size();
int n=t[0].size();
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++)
cout << t[i][j] << " ";
cout << endl;
}
cout << endl;
}

这是我得到的输出:

$ g++ -std=c++11 -c libtestlib.cpp

$ ar rvs libtestlib.a libtestlib.o
r - libtestlib.o

$ g++ -std=c++11 test.cpp libtestlib.a
/tmp/cccJ7SXZ.o:test.cpp:(.text+0x1af): undefined reference to `void test_print<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >)'
/tmp/cccJ7SXZ.o:test.cpp:(.text+0x1af): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `void test_print<std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >)'
collect2: error: ld returned 1 exit status

最佳答案

由于您似乎支持对有限数量的类型进行操作,因此经典的“只需在 header 中执行”这个问题的答案不一定是最好的。

您可以通过为每个实现显式导出符号来获得两全其美,但将实现委托(delegate)给库中的模板:

libteSTLib.h:

#ifndef testlib
#define testlib

#include <vector>
using namespace std;

typedef vector<vector<double>> dtest;
typedef vector<vector<int>> itest;

void test_print(dtest&);
void test_print(itest&);

libteSTLib.cpp:

#include <iostream>
#include "libtestlib.h"
using namespace std;

namespace {
template <typename testtype>
void test_print_impl(testtype &t)
{
int m=t.size();
int n=t[0].size();
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++)
cout << t[i][j] << " ";
cout << endl;
}
cout << endl;
}
}

void test_print(dtest& val) {
test_print_impl(val);
}

void test_print(itest& val) {
test_print_impl(val);
}

请注意,对于像这样的小功能,可能不值得付出努力,只需在 header 中内联模板代码就可以了。函数的复杂性和依赖性的范围在什么时候保证这是一个判断调用。

关于linux - 使用模板使用 g++ -std=c++11 创建静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55659480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com