小编dcr*_*cro的帖子

未定义的引用在GCC下交叉编译LTO的静态库

我试图使用GCC 4.9.2从Linux(x86_64-pc-linux-gnu)for Windows(x86_64-w64-mingw32)交叉编译应用程序.

当构建链接到静态库并且还使用链接时优化的目标时,我从链接器获取目标从库中使用的所有符号的未定义引用错误.

例如,从bar.cpp建立bar.a

int bar (void) {return 42;}
Run Code Online (Sandbox Code Playgroud)

并与foo.cpp链接

extern int bar (void);
int main (int, char**) {bar ();}
Run Code Online (Sandbox Code Playgroud)

使用命令行

x86_64-w64-mingw32-g++ -flto -o foo.o -c foo.cpp
x86_64-w64-mingw32-g++ -flto -o bar.o -c bar.cpp
x86_64-w64-mingw32-gcc-ar rc bar.a bar.o
x86_64-w64-mingw32-gcc-ranlib bar.a
x86_64-w64-mingw32-g++ -flto -fuse-linker-plugin foo.o bar.a -o foo
Run Code Online (Sandbox Code Playgroud)

导致错误

/tmp/ccc3Twsc.lto.o:foo.o:(.text+0x15): undefined reference to `bar()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

从上面:

  • 我正在使用ar/ranlib的gcc-wrappers
  • 没有外部依赖
  • 所有文件都使用相同的选项进行编译

我尝试过使用-fuse-linker-plugin,gcc-ar vs ar,符号可见性选项,操作等的各种组合,但是如果不关闭LTO,我无法正确链接.

所有目标都在本机编译器(x86_64 Linux)下正确构建.

有什么明显的东西我在这里不见了吗?

c++ gcc mingw cross-compiling lto

8
推荐指数
1
解决办法
2096
查看次数

如何定义模板类专业化的静态 constexpr 数组成员

我尝试在模板专用类中使用静态 constexpr 数组,如下所示:

///////////////////////////////////////////////////////////////////////////
struct good {
    static constexpr int values[1] = { 0 };
};

constexpr int good::values[1];

///////////////////////////////////////////////////////////////////////////
template <typename T>
struct bad;

template <>
struct bad<int> {
    static constexpr int values[1] = { 0 };  
};

constexpr int bad<int>::values[1];

///////////////////////////////////////////////////////////////////////////
int
main (int argc, char **argv)
{
#if 1
    return good::values[0];
#else
    return bad<int>::values[0];
#endif
}
Run Code Online (Sandbox Code Playgroud)

我知道声明和定义静态成员的要求,并且上面的“好”情况似乎使用 -std=c++1z 在 gcc-6.2.0 和 clang-3.9.0 上取得了成功。

然而,“坏”情况会导致 clang-3.9.0 下出现未定义的引用,输出如下:

danny@steve ~/src $ clang++ -std=c++1z scratch.cpp
/tmp/scratch-56fa44.o: In function `main':
scratch.cpp:(.text+0x15): …
Run Code Online (Sandbox Code Playgroud)

c++ templates clang static-members constexpr

5
推荐指数
1
解决办法
356
查看次数

标签 统计

c++ ×2

clang ×1

constexpr ×1

cross-compiling ×1

gcc ×1

lto ×1

mingw ×1

static-members ×1

templates ×1