我看过很多关于解决此类链接器错误的帖子,在大多数情况下,人们只是忘记使用 进行编译-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) 我写了一个方面,我试图用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) 我想编写两个模板函数,一个捕获特定情况,另一个捕获与第一个情况不匹配的所有其他情况。我尝试使用 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) aspectj ×1
c++ ×1
c++17 ×1
enable-if ×1
fpic ×1
g++ ×1
pybind11 ×1
setuptools ×1
spring-aop ×1
std-variant ×1