【问题标题】:How to build an example cppkafka using qmake & mingw?如何使用 qmake & mingw 构建示例 cppkafka?
【发布时间】:2020-08-31 13:02:26
【问题描述】:

我需要远离cmake,所以我想在mingw上构建一个qmake项目。请帮助我了解缺少的内容。从https://github.com/mfontanini/cppkafka构建CPPKafka

ma​​in.cpp

#include <cppkafka/cppkafka.h>
using namespace std;
using namespace cppkafka;
int main() {
    Configuration config = {    // Create the config
        { "metadata.broker.list", "127.0.0.1:9092" }
    };
    Producer producer(config);    // Create the producer
    string message = "hey there!";    // Produce a message!
    producer.produce(MessageBuilder("my_topic").partition(0).payload(message));
    producer.flush();
    return 0;
}

.pro 文件

TEMPLATE = app
CONFIG += console c++14
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.cpp
INCLUDEPATH += 'C:\Program Files\CppKafka\include' \
               'C:\Program Files\RdKafka\include' \
               'C:\boost_1_72_0' \
               'C:\Program Files\CppKafka\include\cppkafka'

LIBS +=  'C:\Program Files\RdKafka\bin\librdkafka.dll' \
         'C:\Program Files\RdKafka\bin\librdkafka++.dll' \
         -lpthread \
         -lz \
         -lstdc++ \
         'C:\Program Files\CppKafka\bin\libcppkafka.dll'

命令

g++ -Wl,-subsystem,console -mthreads -o debug\cpp_kafka_ex.exe debug/main.o "C:\Program Files\RdKafka\bin\librdkafka.dll" "C:\Program Files\RdKafka\bin \librdkafka++.dll" -lpthread -lz -lstdc++ "C:\Program Files\CppKafka\bin\libcppkafka.dll"

链接错误

debug/main.o: 在函数std::unique_ptr&lt;rd_kafka_s, cppkafka::KafkaHandleBase::HandleDeleter&gt;::~unique_ptr()': C:/Qt/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/unique_ptr.h:268: undefined reference to cppkafka::KafkaHandleBase::HandleDeleter::operator()(rd_kafka_s*)' collect2.exe:错误:ld 返回 1 个退出状态

cmake

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include)
include_directories('C:\Program Files\RdKafka\include')
include_directories(C:\boost_1_72_0)

add_custom_target(examples)
macro(create_example example_name)
    string(REPLACE "_" "-" sanitized_name ${example_name})
    add_executable(${sanitized_name} EXCLUDE_FROM_ALL "${example_name}_example.cpp")
    target_link_libraries(${sanitized_name} cppkafka RdKafka::rdkafka Boost::boost Boost::program_options)
    add_dependencies(examples ${sanitized_name})
endmacro()

create_example(producer)
create_example(buffered_producer)
create_example(consumer)
create_example(consumer_dispatcher)
create_example(metadata)
create_example(consumers_information)

【问题讨论】:

    标签: c++ qmake librdkafka


    【解决方案1】:

    您需要将dllexport 添加到struct HandleDeleter 并重建。

    include\cppkafka\kafka_handle_base.h之前:

    struct HandleDeleter {
            explicit HandleDeleter(const KafkaHandleBase* handle_base_ptr) : handle_base_ptr_{handle_base_ptr} {}
            void operator()(rd_kafka_t* handle);
        private:
            const KafkaHandleBase * handle_base_ptr_;
        };
    

    之后:

    struct CPPKAFKA_API HandleDeleter {
            explicit HandleDeleter(const KafkaHandleBase* handle_base_ptr) : handle_base_ptr_{handle_base_ptr} {}
            void operator()(rd_kafka_t* handle);
        private:
            const KafkaHandleBase * handle_base_ptr_;
        };
    

    【讨论】:

    • 我已经尝试过了,它成功了,然后我重新编译了库并再次链接它(做了相同的更改),但现在它不起作用了!在 undefined reference to __imp__ 之后添加 CPPKAFKA_API undefined reference to cppkafka::KafkaHandleBase::HandleDeleter::operator()(rd_kafka_s*)' 之前
    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多