小编tha*_*yne的帖子

在已使用 fPIC 的情况下创建共享对象时,不能使用针对符号的重定位 R_X86_64_PC32

我看过很多关于解决此类链接器错误的帖子,在大多数情况下,人们只是忘记使用 进行编译-fPIC,有时人们在使用内联函数时遇到麻烦,等等,但这里的情况并非如此。我正在尝试使用Pybind11包装 python 的 c++ 库。在此过程中,我想将一些静态库(其中之一是newmat11)链接到 .so 文件中。

我使用 automake 系统构建 newmat11 库-fPIC(这是一些输出......)

...
g++ -DHAVE_CONFIG_H -I. -g -O2 -MT newmat8.lo -MD -MP -MF .deps/newmat8.Tpo -c newmat8.cpp  -fPIC -DPIC -o newmat8.o
...
ar cru libnewmat11.a  bandmat.o cholesky.o evalue.o fft.o jacobi.o hholder.o myexcept.o newfft.o newmat1.o newmat2.o newmat3.o newmat4.o newmat5.o newmat6.o newmat7.o newmat8.o newmat9.o newmatex.o newmatrm.o solution.o sort.o submat.o svd.o
Run Code Online (Sandbox Code Playgroud)

事实上,当我运行时readelf --relocs libnewmat11.a,我看到很多重新定位的符号。这是给我带来麻烦的一个:

$readelf --relocs libnewmat11.a | grep ZTIN6NEWMAT17Sing
000000001d20  013c00000002 R_X86_64_PC32 …
Run Code Online (Sandbox Code Playgroud)

g++ setuptools linker-errors fpic pybind11

4
推荐指数
1
解决办法
4004
查看次数

在第三方类上进行Spring-AOP加载时编织

我写了一个方面,我试图用junit测试.该方面对第三方方法有一个@Around建议setQuery.在编译时,它抱怨:Can't find referenced pointcut setQuery

这是我的方面:

@Component
@Aspect
public class ElasticsearchQuerySecurityAspect {
    @Around("org.elasticsearch.action.search.SearchRequestBuilder.setQuery() && args(queryBuilder)")
    public void addFilter(final ProceedingJoinPoint pjp, QueryBuilder queryBuilder) throws Throwable {
      Object[] args = pjp.getArgs();

      // Set the filter to use our plugin
      FilterBuilder securityFilter = FilterBuilders.scriptFilter("visibility-filter")
            .lang("native")
            .addParam("visibility-field", "visibility")
            .addParam("parameter", "default");

      // Re-create original query with the filter applied
      QueryBuilder newQuery = QueryBuilders.filteredQuery(queryBuilder,securityFilter);
      log.info("Adding filter to search request");
        // Tell the method to run with the modified parameter
        args[0] = newQuery;
        pjp.proceed(args); …
Run Code Online (Sandbox Code Playgroud)

aspectj spring-aop

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

使用 std::enable_if 重载函数以避免模板替换错误

我想编写两个模板函数,一个捕获特定情况,另一个捕获与第一个情况不匹配的所有其他情况。我尝试使用 std::enable_if 来捕获特定情况,但编译器仍然因不明确的匹配而失败。如何编写这些重载函数以便编译器解决歧义?(我使用的是g++)

我尝试编写以下代码(这是重现问题的简化示例):

struct resource1_t{
};

struct resource2_t{
};

template <typename R, typename V>
struct unit_t{
  typedef R resource_t;
  typedef V value_t;
  unit_t(value_t const& value):v(){}
  value_t v;
  value_t calcValue(resource_t const& r)const{return v;}
};

// Specific case (U::resource_t == R)
template <typename U, typename R, typename=std::enable_if_t<std::is_same_v<typename U::resource_t,R>>>
      typename U::value_t callCalcValue(U const& u, R const& r){
        return u.calcValue(r);
      }

 // General case (U::resource_t != R)
 template <typename U, typename R>
      typename U::value_t callCalcValue(U const& u, R const& r){
        // Fail immediately! …
Run Code Online (Sandbox Code Playgroud)

c++ enable-if c++17 std-variant

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