我在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) 因此,我的用例是在使用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
我有一个多模块的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) 是否可以重写此代码以更好地使用处理器?我有一个类,它在一个单独的线程中使用固定的周期执行一些任务.有时可以暂停和恢复此过程.目前我正在使用暂停的标志,它工作正常,但这样的循环仍然会在进程暂停时加载处理器.有可能解决这个问题吗?
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 ×2
android ×1
apache-kafka ×1
c++ ×1
concurrency ×1
gradle ×1
opencv ×1
python ×1
sonar-runner ×1
sonarqube ×1