小编Raj*_*ani的帖子

Python ImportError - 未定义的符号 - 用于自定义C++模块

我在Ubuntu 11.04上使用OpenCV 2.3到2.4.2在C++中开发了一个Python模块.OpenCV是从源代码构建的.我没有使用Ubuntu存储库中的OpenCV版本.

我的Python模块编译没有任何问题,并正确加载到Python中.但是,当我在Ubuntu 11.10或12.04上编译此模块时,我在尝试在Python中加载时会收到带有"未定义符号"消息的ImportError.

这是我编译模块的方式:

g++ -fPIC -shared `pkg-config --cflags --libs python` `pkg-config --cflags --libs opencv` -I/usr/local/include/opencv2/legacy -o mymodule.so mymodule.cpp
Run Code Online (Sandbox Code Playgroud)

这是"pkg-config --cflags --libs opencv"的输出

-I/usr/local/include/opencv -I/usr/local/include  /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_ts.so /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

ImportError: /path/to/service/mymodule.so: undefined symbol: _ZN5CvSVMD1Ev
Run Code Online (Sandbox Code Playgroud)

我的理解是"未定义的符号"通常意味着在任何链接库中都找不到给定的符号.但是我知道libopencv_ml.so中有这个符号,因为当我运行它时:

$ nm -g  /usr/local/lib/libopencv_ml.so | grep _ZN5CvSVMD1Ev
Run Code Online (Sandbox Code Playgroud)

我明白了:

000000000002fd40 T _ZN5CvSVMD1Ev
Run Code Online (Sandbox Code Playgroud)

/ usr/local/lib似乎在动态链接器缓存中.

$ cat /etc/ld.so.conf.d/libc.conf 
# libc default configuration
/usr/local/lib
Run Code Online (Sandbox Code Playgroud)

而so文件也在缓存中.

$ ldconfig -p | grep opencv | …
Run Code Online (Sandbox Code Playgroud)

c++ python opencv shared-libraries

18
推荐指数
1
解决办法
3万
查看次数

在使用Flux(包括重试)消耗时按顺序调用非阻塞操作

因此,我的用例是在使用Project Reactor以反应式样式编程时使用Spring Webflux应用程序中的Kafka消息,并按照从Kafka收到消息的相同顺序对每个消息执行非阻塞操作.系统也应该能够自行恢复.

以下是设置为使用的代码段:

    Flux<ReceiverRecord<Integer, DataDocument>> messages = Flux.defer(() -> {
        KafkaReceiver<Integer, DataDocument> receiver = KafkaReceiver.create(options);
        return receiver.receive();
    });

    messages.map(this::transformToOutputFormat)
            .map(this::performAction)
            .flatMapSequential(receiverRecordMono -> receiverRecordMono)
            .doOnNext(record -> record.receiverOffset().acknowledge())
            .doOnError(error -> logger.error("Error receiving record", error))
            .retryBackoff(100, Duration.ofSeconds(5), Duration.ofMinutes(5))
            .subscribe();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我所做的是:从Kafka获取消息,将其转换为用于新目标的对象,然后将其发送到目标,然后确认偏移以将消息标记为已消耗和处理.以与从Kafka消耗的消息相同的顺序确认偏移量是至关重要的,这样我们就不会将偏移量移动到未完全处理的消息之外(包括将一些数据发送到目的地).因此我用a flatMapSequential来确保这一点.

为简单起见,我们假设该transformToOutputFormat()方法是一种身份变换.

public ReceiverRecord<Integer, DataDocument> transformToOutputFormat(ReceiverRecord<Integer, DataDocument> record) {
    return record;
}
Run Code Online (Sandbox Code Playgroud)

performAction()方法需要通过网络执行某些操作,例如调用HTTP REST API.因此适当的API返回Mono,这意味着需要订阅链.此外,我需要ReceiverRecord通过此方法返回,以便可以在上面的flatMapSequential()运算符中确认偏移量.因为我需要Mono订阅,我正在flatMapSequential上面使用.如果没有,我可以用一个map代替.

public Mono<ReceiverRecord<Integer, DataDocument>> performAction(ReceiverRecord<Integer, DataDocument> record) {
    return Mono.just(record)
            .flatMap(receiverRecord ->
                    HttpClient.create()
                            .port(3000)
                            .get()
                            .uri("/makeCall?data=" + …
Run Code Online (Sandbox Code Playgroud)

java reactive-programming apache-kafka project-reactor spring-webflux

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

在使用gradle的多项目java代码库上使用sonarRunner,跳过恰好一个项目的类

我有一个多模块的java代码库,我使用gradle的多项目支持构建.使用的gradle版本是1.6.该代码用于构建Oracle ATG应用程序,我使用gradle java插件和自定义解析器来管理模块/项目与外部ATG模块之间的依赖关系.

构建工作正常,我可以编译和创建没有问题的罐子.

我还使用gradle eclipse插件,并且可以将gradle多项目导入到eclipse中,这导致所有子项目都被导入到Eclipse中,并且java build-path管理得很好.

我使用的是带有gradle的sonar-runner插件,Sonar的版本是3.4.1.我正在使用Sonar附带的H2数据库.

这是我用来在根项目中配置sonarRunner的方法build.gradle:

apply plugin: "sonar-runner"

sonarRunner {
    sonarProperties {
      property "sonar.host.url", "http://localhost:9000"
      property "sonar.jdbc.url", "jdbc:h2:tcp://localhost:9092/sonar"
      property "sonar.jdbc.driverClassName", "org.h2.Driver"
      property "sonar.jdbc.username", "sonar"
      property "sonar.jdbc.password", "sonar"
    }
}
Run Code Online (Sandbox Code Playgroud)

对于每个子项目,我这样做:

sonarRunner {
    sonarProperties {
        property "sonar.projectName", pathToAtgModuleName(path)
        property "sonar.sourceEncoding", "UTF-8"
        property "sonar.language", "java"
    }
}
Run Code Online (Sandbox Code Playgroud)

我设置了sonar.projectName属性,以便Sonar仪表板可以正确显示嵌套模块.sonar.projectName的值如下所示:ParentModule.ChildModule.SubChildModule.

Sonar报告适用于大多数模块,除了一个.它似乎只是忽略了这个模块中的所有类.

我的项目结构是这样的(包括内部类的java类的数量在右边):

RootProj/core 356
RootProj/MyMod 343
RootProj/MyMod/versioned 0
RootProj/MyMod/versioned/catalog 33
RootProj/integration/int1 9
RootProj/integration/int2 7
RootProj/integration/int3 5
RootProj/integration/int4 2
RootProj/integration/int5 17
RootProj/integration/int6 44
RootProj/perf 0 …
Run Code Online (Sandbox Code Playgroud)

gradle sonar-runner sonarqube

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

需要更有效的暂停循环方式

是否可以重写此代码以更好地使用处理器?我有一个类,它在一个单独的线程中使用固定的周期执行一些任务.有时可以暂停和恢复此过程.目前我正在使用暂停的标志,它工作正常,但这样的循环仍然会在进程暂停时加载处理器.有可能解决这个问题吗?

private boolean mIsCanceled = false;
private boolean mIsPaused = true; // TODO more efficient for processor way of pausing is required
private final Thread mTimerThread = new Thread(new Runnable() {
    @Override
    public void run() {
        while(!mIsCanceled){
            try {
                Thread.sleep(UPDATE_PERIOD);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (!mIsPaused){
                doStep();
            }
        }
    }
});

public MyClass(){
    mTimerThread.start();
}

private void pause(){
    mIsPaused = true;
}

private void resume(){
    mIsPaused = false;
}

private void doStep(){
    // Some code
}
Run Code Online (Sandbox Code Playgroud)

请提供我的代码的替代实现. …

java concurrency multithreading android

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