我有一个共享库,它应该只导出一个标有的函数__attribute__ ((visibility ("default"))).它还链接到另一个静态库(fftw),和
#include<fftw3.h>
Run Code Online (Sandbox Code Playgroud)
之前是:
#pragma GCC visibility push(hidden)
Run Code Online (Sandbox Code Playgroud)
使用的链接器命令:
g++.exe -fvisibility=hidden -shared -o mylib.dll -Wl,--out-implib,mylib.dll.a -Wl,--no-whole-archive libfftw3.a libfftw3_omp.a -lgomp
Run Code Online (Sandbox Code Playgroud)
现在生成的库很庞大,如果我检查导出的函数,它包括所有fftw函数,以及我文件中的ALL函数.看起来mingw忽略了可见性选项.我读过之前它给出了警告-fvisibility,但现在它编译时没有任何警告.
mingw和gcc 4.6.1是否支持可见性标志?如果是,我如何摆脱共享库中的所有不必要的东西?
请看下面的代码,抱歉有点冗长,但我尽力用最小的例子重现问题(还有它的实时副本).在那里我基本上有一个返回字符串文字大小的元函数,以及包装它的constexpr函数.然后当我在模板参数中调用这些函数时,gcc(5.4,6.2)对它很满意,但是在测试体中,clang(3.8,3.9)barfs与"非类型模板参数不是常量表达式" strsize(s).如果我用str_size<S>两个编译器替换都很高兴.所以问题是:
这是clang或我的代码有问题吗?
使用constexpr函数在clang和gcc上编译它的方法是什么?
template<size_t N> using string_literal_t = char[N];
template<class T> struct StrSize; ///< metafunction to get the size of string literal alikes
/// specialize StrSize for string literals
template<size_t N>
struct StrSize <string_literal_t<N>>{ static constexpr size_t value = N-1; };
/// template variable, just for convenience
template <class T>
constexpr size_t str_size = StrSize<T>::value;
/// now do the same but with constexpr function
template<class T>
constexpr auto strsize(const T&) noexcept-> decltype(str_size<T>) {
return …Run Code Online (Sandbox Code Playgroud)我有一个C++类,它实现了二进制兼容接口(用作共享库),因此只返回C类型.字符串为const char*,void指针,以及指向具有二进制兼容接口的其他类的指针.问题是如何组织内存管理,我应该返回现有类数据的常量指针(用户使用过时指针的危险),并在那里释放内存,或者更确切地指向某些堆变量,并让用户负责删除这些指针以后还是??? 对此有一些一般性的指导方针吗?
我vector<bool>在不同的vector<double>次数上乘以常数.我想知道它有多快,首先将其转换为更快vector<double>,以便可以使用sse吗?
void applyMask(std::vector<double>& frame, const std::vector<bool>& mask)
{
std::transform(frame.begin(), frame.end(), mask.begin(), frame.begin(), [](const double& x, const bool& m)->double{ return x*m;});
}
Run Code Online (Sandbox Code Playgroud)