From 772c8f402b0f5b0c0cf8989a7b5216f85f44ff56 Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Mon, 11 May 2026 18:22:32 -0700 Subject: [PATCH] cc_defs: Add -rdynamic to linkopts for clang compiler by default --- ros2/cc_defs.bzl | 5 +++++ ros2/cc_opts.bzl | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/ros2/cc_defs.bzl b/ros2/cc_defs.bzl index 524c5407..847f870c 100644 --- a/ros2/cc_defs.bzl +++ b/ros2/cc_defs.bzl @@ -3,6 +3,7 @@ load("@com_github_mvukov_rules_ros2//ros2:ament.bzl", "sh_exec_launcher", "split_kwargs") load("@com_github_mvukov_rules_ros2//ros2:cc_opts.bzl", "C_COPTS") +load("@com_github_mvukov_rules_ros2//ros2:cc_opts.bzl", "CPP_LINKOPTS") load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load("@rules_shell//shell:sh_test.bzl", "sh_test") @@ -10,11 +11,14 @@ load("@rules_shell//shell:sh_test.bzl", "sh_test") def _ros2_cc_target(target, lang, name, ros2_package_name, **kwargs): if lang == "c": all_copts = C_COPTS + all_linkopts = [] elif lang == "cpp": all_copts = [] + all_linkopts = CPP_LINKOPTS else: fail("lang must be set to c or cpp!") all_copts = all_copts + kwargs.pop("copts", []) + all_linkopts = all_linkopts + kwargs.pop("linkopts", []) ros2_package_name = ros2_package_name or name all_local_defines = ["ROS_PACKAGE_NAME=\\\"{}\\\"".format(ros2_package_name)] @@ -23,6 +27,7 @@ def _ros2_cc_target(target, lang, name, ros2_package_name, **kwargs): target( name = name, copts = all_copts, + linkopts = all_linkopts, local_defines = all_local_defines, **kwargs ) diff --git a/ros2/cc_opts.bzl b/ros2/cc_opts.bzl index 33158b5f..0e3dfe74 100644 --- a/ros2/cc_opts.bzl +++ b/ros2/cc_opts.bzl @@ -2,3 +2,9 @@ """ C_COPTS = ["-std=c11"] + +# Export dynamic symbols for pluginlib/class_loader with LLVM toolchain. +CPP_LINKOPTS = select({ + "@rules_cc//cc/compiler:clang": ["-rdynamic"], + "//conditions:default": [], +})