Skip to content

linker issues when building a standalone plugin + fix suggestion #10

@jordanauge

Description

@jordanauge

Hi,

I followed the steps in the README to compile the sample output plugin as standalone.

As suggested i have cloned the fluent-bit source code from current master, and have the cmake command point to it through FLB_SOURCE

I did not test using header packages either, since there is this open issue that i also faced:
fluent/fluent-bit#7028

I also had to follow this comment and run cmake to have autogenerated files working:
#2 (comment)

So far i could only test this on MacOS, and I still have the following error:

[100%] Linking C shared library ../flb-out_stdout2.dylib
Undefined symbols for architecture arm64:
  "_co_switch", referenced from:
      _flb_output_return_do in stdout2.c.o
  "_flb_coro_get", referenced from:
      _flb_output_return_do in stdout2.c.o
  "_flb_errno_print", referenced from:
      _flb_output_return in stdout2.c.o
  "_flb_event_chunk_destroy", referenced from:
      _flb_output_return in stdout2.c.o
  "_flb_output_flush_prepare_destroy", referenced from:
      _flb_output_return in stdout2.c.o
  "_flb_output_thread_instance_get", referenced from:
      _flb_output_return in stdout2.c.o
  "_flb_pack_print", referenced from:
      _cb_stdout_flush in stdout2.c.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [flb-out_stdout2.dylib] Error 1
make[1]: *** [out_stdout2/CMakeFiles/flb-out_stdout2.dir/all] Error 2
make: *** [all] Error 2

A fix that worked for me was to update the FLB_PLUGIN_MACRO with code borrowed from here:
https://github.com/icn-team/cmake-modules/blob/a7b8a8e60fb4b4d35df628003f1d80438736603b/Modules/BuildMacros.cmake#L334

The working macro:

macro(FLB_PLUGIN name src deps)
  add_library(flb-${name} SHARED ${src})
  set_target_properties(flb-${name} PROPERTIES PREFIX "")
  set_target_properties(flb-${name} PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

  if (${CMAKE_SYSTEM_NAME} MATCHES Darwin)
    list(APPEND ARG_LINK_FLAGS "-Wl,-undefined,dynamic_lookup")
  elseif(${CMAKE_SYSTEM_NAME} MATCHES iOS)
    list(APPEND ARG_LINK_FLAGS "-Wl,-undefined,dynamic_lookup")
  elseif(${CMAKE_SYSTEM_NAME} MATCHES Linux)
    list(APPEND ARG_LINK_FLAGS "-Wl,-unresolved-symbols=ignore-all")
  elseif(${CMAKE_SYSTEM_NAME} MATCHES Windows)
    list(APPEND ARG_LINK_FLAGS "/wd4275")
  else()
    message(FATAL_ERROR "Trying to build module on a not supportd platform. Aborting.")
  endif()
  target_link_options(flb-${name} PRIVATE ${ARG_LINK_FLAGS})

  target_link_libraries(flb-${name} ${deps})
endmacro()

Note that depending on the target cmake version, there is also the possibility to pass the flags as the second parameter of FLB_PLUGIN, which passes it to target_link_libraries, as documented here: https://cmake.org/cmake/help/latest/command/target_link_libraries.html

What are your opinions on this ? Thanks in advance.

🙌 Thanks to Mauro for suggesting the fix

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions