กฎ
- สําเนาถึง
- สําเนาถึง cc_import
- สําเนาถึงห้องสมุด
- สําเนา proto_library
- สําเนาถึง คลังภาพที่แชร์
- ff_prefetch_hints
- fdo_profile
- propeller_optimize
- สําเนา [test_test]
- สําเนา cc_toolchain
- สําเนา cc_toolchain_suite
สําเนาคู่
ดูแหล่งที่มาของกฎcc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
เป้าหมายเอาต์พุตโดยนัย
name.stripped
(สร้างหากขออย่างชัดแจ้งเท่านั้น): ไบนารีของไบนารีที่ถูกตัดออก ระบบจะเรียกใช้strip -g
ในไบนารีเพื่อนําสัญลักษณ์การแก้ไขข้อบกพร่องออก ระบุตัวเลือกแถบเพิ่มเติมในบรรทัดคําสั่งได้โดยใช้--stripopt=-foo
เอาต์พุตนี้สร้างขึ้นหากมีการขออย่างชัดแจ้งเท่านั้นname.dwp
(สร้างเฉพาะในกรณีที่ขออย่างชัดแจ้ง): หากเปิดใช้ Fission อยู่ ไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องเหมาะสําหรับการแก้ไขข้อบกพร่องไบนารีที่ทําให้ใช้งานได้จากระยะไกล หากเป็นไฟล์อื่นๆ
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
deps
|
โดยอาจเป็นเป้าหมาย |
srcs
|
ไฟล์ ระบบจะไม่รวบรวมไฟล์ ต้องระบุไฟล์ทั้งหมด หากชื่อของกฎอยู่ใน
ไฟล์
...และกฎที่สร้างไฟล์เหล่านั้น ส่วนขยายที่ต่างกันจะแสดงภาษาโปรแกรมที่แตกต่างกันตามระเบียบ Gcc |
additional_linker_inputs
|
เช่น สามารถระบุไฟล์ .res ของ Windows ที่คอมไพล์ที่นี่เพื่อฝังในเป้าหมายไบนารีได้ |
copts
|
ระบบจะเพิ่มสตริงแต่ละสตริงในแอตทริบิวต์นี้ตามลําดับที่กําหนดไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
defines
|
-D และเพิ่มลงในบรรทัดคําสั่งคอมไพล์ไปยังเป้าหมายนี้ รวมถึงทุกกฎที่ขึ้นอยู่กับโทเค็นดังกล่าว โปรดใช้ความระมัดระวังอย่างยิ่ง เพราะอาจมีผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มการกําหนดค่าลงใน local_defines แทน
|
includes
|
ขึ้นอยู่กับการใช้แทน "Makeตัวแปร"
แต่ละสตริงจะมี คุณต้องเพิ่มส่วนหัวใน src หรือ hdrs มิฉะนั้นส่วนหัวจะไม่พร้อมใช้งานสําหรับกฎที่อ้างอิงเมื่อการคอมไพล์แซนด์บ็อกซ์ (ค่าเริ่มต้น) |
linkopts
|
LINKOPTS ก่อนลิงก์เป้าหมายไบนารี
องค์ประกอบแต่ละรายการของรายการนี้ที่ไม่ได้ขึ้นต้นด้วย |
linkshared
|
linkshared=True ไว้ในกฎ โดยค่าเริ่มต้น ตัวเลือกนี้จะปิดอยู่
การตั้งค่าสถานะนี้หมายความว่าการลิงก์มีการตั้งค่าสถานะ
หากระบุทั้ง |
linkstatic
|
cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดคงที่ โปรดดู cc_library.linkstatic ด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดใช้สําหรับ
หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกให้เครื่องมือสร้างบิลด์ลิงก์ใน มีสามวิธีในการเชื่อมโยงไฟล์ปฏิบัติการ:
แอตทริบิวต์
หากเป็น |
local_defines
|
-D นําหน้าและเพิ่มไปยังบรรทัดคําสั่งคอมไพล์สําหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในทรัพยากรที่เชื่อมโยงกัน
|
malloc
|
โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ |
nocopts
|
COPTS ที่มีอยู่ก่อนแล้วที่ตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดเจนในแอตทริบิวต์ opts ของกฎ) ออกจาก COPTS เพื่อคอมไพล์กฎนี้
แอตทริบิวต์นี้แทบไม่จําเป็น
|
stamp
|
ไบนารีที่ประทับตราจะไม่ได้รับการสร้างใหม่ เว้นแต่ทรัพยากร Dependency จะเปลี่ยนแปลง |
win_def_file
|
ควรใช้แอตทริบิวต์นี้เฉพาะเมื่อ Windows เป็นแพลตฟอร์มเป้าหมาย ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้ |
นําเข้าสําเนา
ดูแหล่งที่มาของกฎcc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)
กฎ cc_import
อนุญาตให้ผู้ใช้นําเข้าไลบรารี C/C++ ที่รวบรวมข้อมูลไว้ล่วงหน้า
กรณีการใช้งานทั่วไปมีดังนี้
1. การลิงก์ไลบรารีแบบคงที่
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.a", # If alwayslink is turned on, # libmylib.a will be forcely linked into any binary that depends on it. # alwayslink = 1, )2. การลิงก์ไลบรารีที่ใช้ร่วมกัน (Unix)
cc_import( name = "mylib", hdrs = ["mylib.h"], shared_library = "libmylib.so", )3. การลิงก์ไลบรารีที่ใช้ร่วมกันกับไลบรารีอินเทอร์เฟซ (Windows)
cc_import( name = "mylib", hdrs = ["mylib.h"], # mylib.lib is an import library for mylib.dll which will be passed to linker interface_library = "mylib.lib", # mylib.dll will be available for runtime shared_library = "mylib.dll", )4. การลิงก์ไลบรารีที่ใช้ร่วมกันกับ
system_provided=True
(Windows)
cc_import( name = "mylib", hdrs = ["mylib.h"], # mylib.lib is an import library for mylib.dll which will be passed to linker interface_library = "mylib.lib", # mylib.dll is provided by system environment, for example it can be found in PATH. # This indicates that Bazel is not responsible for making mylib.dll available. system_provided = 1, )5. การลิงก์กับไลบรารีที่ใช้ร่วมกันหรือแบบคงที่
ใน Unix:
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.a", shared_library = "libmylib.so", ) # first will link to libmylib.a cc_binary( name = "first", srcs = ["first.cc"], deps = [":mylib"], linkstatic = 1, # default value ) # second will link to libmylib.so cc_binary( name = "second", srcs = ["second.cc"], deps = [":mylib"], linkstatic = 0, )ใน Windows:
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.lib", # A normal static library interface_library = "mylib.lib", # An import library for mylib.dll shared_library = "mylib.dll", ) # first will link to libmylib.lib cc_binary( name = "first", srcs = ["first.cc"], deps = [":mylib"], linkstatic = 1, # default value ) # second will link to mylib.dll through mylib.lib cc_binary( name = "second", srcs = ["second.cc"], deps = [":mylib"], linkstatic = 0, )
cc_import
สนับสนุนแอตทริบิวต์ include ตัวอย่างเช่น
cc_import( name = "curl_lib", hdrs = glob(["vendor/curl/include/curl/*.h"]), includes = [ "vendor/curl/include" ], shared_library = "vendor/curl/lib/.libs/libcurl.dylib", )
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
deps
|
deps ได้ที่แอตทริบิวต์ทั่วไปที่กําหนดโดยกฎบิวด์ส่วนใหญ่
|
hdrs
|
|
alwayslink
|
หาก "ลิงก์ตลอดเวลา" ใช้งานไม่ได้กับ VS 2017 ใน Windows นั่นเป็นเพราะปัญหาที่ทราบแล้ว โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด |
interface_library
|
ประเภทไฟล์ที่อนุญาต: |
shared_library
|
ประเภทไฟล์ที่อนุญาต: |
static_library
|
ประเภทไฟล์ที่อนุญาต: |
system_provided
|
interface_library และ shared_library ควรว่างเปล่า
|
สําเนาถึง
ดูแหล่งที่มาของกฎcc_library(name, deps, srcs, data, hdrs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
การตรวจสอบการรวมส่วนหัว
ไฟล์ส่วนหัวทั้งหมดที่ใช้ในบิลด์ต้องประกาศในกฎ hdrs
หรือ srcs
จาก cc_*
รายการ ซึ่งมีผลบังคับใช้
สําหรับกฎ cc_library
ส่วนหัวใน hdrs
จะประกอบด้วยอินเทอร์เฟซสาธารณะของไลบรารีและรวมไว้ทั้งจากไฟล์ใน hdrs
และ srcs
ของไลบรารีโดยตรง รวมถึงจากไฟล์ใน hdrs
และ srcs
ของกฎ cc_*
รายการที่แสดงไลบรารีใน deps
ส่วนหัวใน srcs
ต้องรวมจากไฟล์ใน hdrs
และ srcs
ของไลบรารีโดยตรงเท่านั้น เมื่อตัดสินใจว่าจะเพิ่มส่วนหัวลงใน hdrs
หรือ srcs
คุณควรถามว่าต้องการให้ผู้บริโภคของไลบรารีนี้รวมไลบรารีนี้โดยตรงหรือไม่ ตามที่คร่าวๆ เป็นการตัดสินใจเดียวกับภาษาpublic
กับprivate
ในการเขียนโปรแกรมภาษา
กฎ cc_binary
และ cc_test
ไม่มีอินเทอร์เฟซที่ส่งออก ดังนั้นจึงไม่มีแอตทริบิวต์ hdrs
ส่วนหัวทั้งหมดที่เป็นของไบนารีหรือการทดสอบโดยตรงควรแสดงอยู่ใน srcs
โปรดดูตัวอย่างต่อไปนี้เพื่ออธิบายกฎเหล่านี้
cc_binary( name = "foo", srcs = [ "foo.cc", "foo.h", ], deps = [":bar"], ) cc_library( name = "bar", srcs = [ "bar.cc", "bar-impl.h", ], hdrs = ["bar.h"], deps = [":baz"], ) cc_library( name = "baz", srcs = [ "baz.cc", "baz-impl.h", ], hdrs = ["baz.h"], )
การรวมโดยตรงที่ได้รับอนุญาตในตัวอย่างนี้แสดงอยู่ในตารางด้านล่าง ตัวอย่างเช่น foo.cc
ได้รับอนุญาตให้ใส่ foo.h
และ bar.h
โดยตรง แต่ไม่รวม baz.h
กําลังรวมไฟล์ | การรวมที่อนุญาต |
---|---|
foo.h | Bar.h |
foo.cc | foo.h bar.h |
Bar.h | Bar-Impl.h Baz.h |
Bar-Impl.h | Bar.h Baz.h |
Bar.cc | Bar.h bar-impl.h baz.h |
Baz.h | Baz-Impl.h |
Baz-Impl.h | Baz.h |
baz.cc | baz.h baz-impl.h |
กฎการตรวจสอบการรวมจะมีผลกับการรวมโดยตรงเท่านั้น ในตัวอย่างข้างต้น foo.cc
ได้รับอนุญาตให้ใส่ bar.h
ซึ่งอาจรวม baz.h
ซึ่งในทางกลับกันก็จะรวม baz-impl.h
ด้วย ในทางเทคนิค การรวบรวมไฟล์ .cc
จะรวมไฟล์ส่วนหัวไว้ใน hdrs
หรือ srcs
ใน cc_library
เพื่อปิดแบบ deps
ทางอ้อม ในกรณีนี้ คอมไพเลอร์อาจอ่าน baz.h
และ baz-impl.h
เมื่อคอมไพล์ foo.cc
แต่ foo.cc
ต้องไม่มี #include "baz.h"
คุณต้องเพิ่ม baz
ใน deps
จากทั้งหมด foo
จึงจะอนุญาต
Bazel ขึ้นอยู่กับการสนับสนุนของเครื่องมือเชนเพื่อบังคับใช้กฎการตรวจสอบการรวม
เครื่องมือ layering_check
ต้องรองรับฟีเจอร์
นี้และขอเครื่องมืออย่างชัดแจ้ง เช่น ผ่านทางแฟล็กบรรทัดคําสั่ง --features=layering_check
หรือพารามิเตอร์ features
ของฟังก์ชัน package
Badchain ที่ให้บริการโดย Bazel รองรับเฉพาะฟีเจอร์นี้โดยใช้ clang ใน Unix และ macOS
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
deps
|
โดยอาจเป็นเป้าหมาย |
srcs
|
ไฟล์ ระบบจะไม่รวบรวมไฟล์ ต้องระบุไฟล์ทั้งหมด หากชื่อของกฎอยู่ใน
ไฟล์
...และกฎที่สร้างไฟล์เหล่านั้น ส่วนขยายที่ต่างกันจะแสดงภาษาโปรแกรมที่แตกต่างกันตามระเบียบ Gcc |
hdrs
|
ตําแหน่งนี้เหมาะอย่างยิ่งสําหรับการประกาศไฟล์ส่วนหัวที่อธิบายอินเทอร์เฟซสําหรับไลบรารี ส่วนหัวเหล่านี้จะพร้อมใช้งานสําหรับรวบรวมโดยแหล่งที่มาในกฎนี้หรือในกฎที่เกี่ยวข้อง
ส่วนหัวที่ไม่ได้มีไว้สําหรับลูกค้าของไลบรารีนี้ควรแสดงอยู่ในแอตทริบิวต์ |
alwayslink
|
srcs แม้ว่าบางส่วนจะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงก็ตาม
วิธีนี้มีประโยชน์หากโค้ดไม่ได้ถูกเรียกใช้อย่างชัดแจ้งโดยโค้ดในไบนารี เช่น หากโค้ดของคุณลงทะเบียนเพื่อเรียกโค้ดติดต่อกลับจากบริการบางอย่าง
หาก "ลิงก์ตลอดเวลา" ใช้งานไม่ได้กับ VS 2017 ใน Windows นั่นเป็นเพราะปัญหาที่ทราบแล้ว โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด |
copts
|
ระบบจะเพิ่มสตริงแต่ละสตริงในแอตทริบิวต์นี้ตามลําดับที่กําหนดไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
defines
|
-D และเพิ่มลงในบรรทัดคําสั่งคอมไพล์ไปยังเป้าหมายนี้ รวมถึงทุกกฎที่ขึ้นอยู่กับโทเค็นดังกล่าว โปรดใช้ความระมัดระวังอย่างยิ่ง เพราะอาจมีผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มการกําหนดค่าลงใน local_defines แทน
|
implementation_deps
|
deps ตรงที่มีส่วนหัวและเส้นทางของไลบรารีเหล่านี้ (และเส้นทางอ้อมทั้งหมดของไลบรารีเหล่านี้) ใช้ในการคอมไพล์ไลบรารีนี้เท่านั้น ไม่ได้ใช้ไลบรารีที่ขึ้นอยู่กับไลบรารีนี้ ไลบรารีที่ระบุด้วย implementation_deps ยังคงลิงก์กับเป้าหมายไบนารีที่ขึ้นอยู่กับไลบรารีนี้
ตอนนี้การใช้งานจํากัดอยู่ที่ cc_libraries และป้องกันโดยแฟล็ก |
include_prefix
|
เมื่อตั้งค่าแล้ว ส่วนหัวในแอตทริบิวต์ ระบบจะนําคํานําหน้าในแอตทริบิวต์ |
includes
|
ขึ้นอยู่กับการใช้แทน "Makeตัวแปร"
แต่ละสตริงจะมี คุณต้องเพิ่มส่วนหัวใน src หรือ hdrs มิฉะนั้นส่วนหัวจะไม่พร้อมใช้งานสําหรับกฎที่อ้างอิงเมื่อการคอมไพล์แซนด์บ็อกซ์ (ค่าเริ่มต้น) |
linkopts
|
LINKOPTS ก่อนลิงก์เป้าหมายไบนารี
องค์ประกอบแต่ละรายการของรายการนี้ที่ไม่ได้ขึ้นต้นด้วย |
linkstamp
|
base เท่านั้น
|
linkstatic
|
cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดคงที่ โปรดดู cc_library.linkstatic ด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดใช้สําหรับ
หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกให้เครื่องมือสร้างบิลด์ลิงก์ใน มีสามวิธีในการเชื่อมโยงไฟล์ปฏิบัติการ:
แอตทริบิวต์
หากเป็น |
local_defines
|
-D นําหน้าและเพิ่มไปยังบรรทัดคําสั่งคอมไพล์สําหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในทรัพยากรที่เชื่อมโยงกัน
|
nocopts
|
COPTS ที่มีอยู่ก่อนแล้วที่ตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดเจนในแอตทริบิวต์ opts ของกฎ) ออกจาก COPTS เพื่อคอมไพล์กฎนี้
แอตทริบิวต์นี้แทบไม่จําเป็น
|
strip_include_prefix
|
เมื่อตั้งค่าแล้ว ส่วนหัวในแอตทริบิวต์ หากเป็นเส้นทางแบบสัมพัทธ์ ระบบจะถือว่าเส้นทางเป็นแพ็กเกจแบบสัมพัทธ์ หากเป็น URL ที่สมบูรณ์ จะมีการทําความเข้าใจว่าเป็นเส้นทางที่เกี่ยวข้องกับที่เก็บ ระบบจะเพิ่มคํานําหน้าในแอตทริบิวต์ |
textual_hdrs
|
นี่คือตําแหน่งสําหรับประกาศไฟล์ส่วนหัวที่คอมไพล์เองไม่ได้ กล่าวคือ ไฟล์เหล่านั้นจะต้องถูกรวมไว้โดยไฟล์ต้นฉบับอื่นๆ เสมอเพื่อสร้างโค้ดที่ถูกต้อง |
win_def_file
|
ควรใช้แอตทริบิวต์นี้เฉพาะเมื่อ Windows เป็นแพลตฟอร์มเป้าหมาย ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้ |
สําเนา_โปรโตไลบรารี
ดูแหล่งที่มาของกฎcc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
cc_proto_library
สร้างโค้ด C++ จากไฟล์ .proto
รายการ
deps
ต้องชี้ไปที่กฎ proto_library
ตัวอย่าง:
cc_library( name = "lib", deps = [":foo_cc_proto"], ) cc_proto_library( name = "foo_cc_proto", deps = [":foo_proto"], ) proto_library( name = "foo_proto", )
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
deps
|
proto_library ที่จะสร้างโค้ด C++
|
สําเนา_คลังภาพที่แชร์
ดูแหล่งที่มาของกฎcc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)
สร้างไลบรารีที่ใช้ร่วมกัน
ตัวอย่าง
cc_shared_library( name = "foo_shared", deps = [ ":foo", ], dynamic_deps = [ ":bar_shared", ], additional_linker_inputs = [ ":foo.lds", ], user_link_flags = [ "-Wl,--version-script=$(location :foo.lds)", ], ) cc_library( name = "foo", srcs = ["foo.cc"], hdrs = ["foo.h"], deps = [ ":bar", ":baz", ], ) cc_shared_library( name = "bar_shared", shared_lib_name = "bar.so", deps = [":bar"], ) cc_library( name = "bar", srcs = ["bar.cc"], hdrs = ["bar.h"], ) cc_library( name = "baz", srcs = ["baz.cc"], hdrs = ["baz.h"], )
ในตัวอย่าง foo_shared
จะลิงก์ foo
กับ baz
แบบคงที่ เนื้อหาหลังต้องเป็นทรัพยากร Dependency แบบสับเปลี่ยน แต่ไม่ลิงก์กับ bar
เนื่องจากdynamic_dep
bar_shared
ให้การแบบไดนามิกอยู่แล้ว
foo_shared
ใช้ไฟล์ตัวลิงก์ *.lds เพื่อควบคุมสัญลักษณ์ที่ควรส่งออก ตรรกะของกฎ cc_shared_library
ไม่ได้ควบคุมสัญลักษณ์ที่จะส่งออก แต่จะใช้เพียงกฎที่อนุมานว่าส่งออกเพื่อแสดงข้อผิดพลาดในช่วงการวิเคราะห์หากไลบรารีที่ใช้ร่วมกัน 2 รายการส่งออกเป้าหมายเดียวกัน
ระบบจะถือว่าการใช้ cc_shared_library
โดยตรงทั้งหมดเป็นการส่งออก ดังนั้น Bazel จะถือว่าในระหว่างการวิเคราะห์ที่ foo_shared
ส่งออก foo
ระบบจะไม่ถือว่า baz
ส่งออกโดย foo_shared
เป้าหมายทั้งหมดที่ตรงกันโดย exports_filter
จะถือว่าส่งออกด้วย
ทุกๆ cc_library
ในตัวอย่างควรปรากฏมากที่สุดใน cc_shared_library
หากต้องการลิงก์ baz
กับ bar_shared
ด้วย เราจะต้องเพิ่ม tags = ["LINKABLE_MORE_THAN_ONCE"]
ใน baz
เนื่องจากแอตทริบิวต์ shared_lib_name
ไฟล์ที่สร้างโดย bar_shared
จะมีชื่อ bar.so
ตรงข้ามกับชื่อ libbar.so
ที่มันจะมีอยู่แล้วโดยค่าเริ่มต้นใน Linux
ข้อผิดพลาด
Two shared libraries in dependencies export the same symbols.
กรณีนี้จะเกิดขึ้นทุกครั้งที่คุณสร้างเป้าหมายที่มีทรัพยากร Dependency ของ cc_shared_library
2 รายการที่แตกต่างกัน ซึ่งจะส่งออกเป้าหมายเดียวกัน หากต้องการแก้ไขปัญหานี้
คุณต้องหยุดส่งออกไลบรารีในทรัพยากร Dependency ของ cc_shared_library
Two shared libraries in dependencies link the same library statically
ซึ่งจะเกิดขึ้นทุกครั้งที่คุณสร้าง cc_shared_library
ใหม่ที่มีการอ้างอิง cc_shared_library
ที่แตกต่างกัน 2 รายการ ซึ่งเชื่อมโยงกับเป้าหมายเดียวกันแบบคงที่
คล้ายกับข้อผิดพลาดในการส่งออก
วิธีหนึ่งที่แก้ปัญหานี้ได้คือการหยุดลิงก์ไลบรารีกับทรัพยากร Dependency ของ cc_shared_library
ในขณะเดียวกัน ลิงก์ที่ยังใช้ได้จําเป็นต้องส่งออกไลบรารีเพื่อไม่ให้ลิงก์ยังคงสามารถมองเห็นสัญลักษณ์ได้ อีกวิธีหนึ่งคือการดึงข้อมูลไลบรารีที่สามซึ่งส่งออกเป้าหมาย
วิธีที่ 3 คือการติดแท็กผู้ต้องหา cc_library
ด้วย LINKABLE_MORE_THAN_ONCE
ซึ่งวิธีนี้ไม่น่าจะเกิดขึ้นบ่อย และคุณควรตรวจสอบว่า cc_library
ปลอดภัยสําหรับการลิงก์มากกว่า 1 ครั้งจริงๆ
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
ซึ่งหมายความว่าสามารถเข้าถึงไลบรารีในบทสรุปของ deps
ได้แบบเข้าถึงได้ โดยไม่ผ่านการอ้างอิงรายการใดรายการหนึ่งของ cc_shared_library
แต่มีการลิงก์กับ cc_shared_library
ตัวอื่นใน dynamic_deps
แล้วและไม่มีการส่งออก
วิธีส่งออกคือการส่งออกจากทรัพยากร Dependency cc_shared_library
หรือดึง cc_shared_library
ตัวที่ 3 ออกมา
Do not place libraries which only contain a precompiled dynamic library in deps.
หากคุณมีไลบรารีแบบไดนามิกที่คอมไพล์ไว้ล่วงหน้า ก็ไม่จําเป็นต้องลิงก์แบบคงที่และลิงก์กับเป้าหมาย cc_shared_library
ปัจจุบันที่คุณกําลังสร้างแบบคงที่ ดังนั้น หมวดหมู่นี้จึงไม่ได้อยู่ใน deps
ของ cc_shared_library
หากไลบรารีแบบไดนามิกที่คอมไพล์ล่วงหน้านี้ขึ้นอยู่กับ cc_libraries
ของคุณ cc_library
จะต้องใช้บริการไลบรารีดังกล่าวโดยตรง
Trying to export a library already exported by a different shared library
คุณจะเห็นข้อผิดพลาดนี้หากกฎปัจจุบันที่คุณอ้างว่าส่งออกเป้าหมายที่กําลังได้รับการส่งออกโดยทรัพยากร Dependency แบบไดนามิกรายการใดรายการหนึ่งอยู่แล้ว
ในการแก้ไขปัญหานี้ ให้นําเป้าหมายออกจาก deps
แล้วใช้เพียงการขึ้นต่อกันแบบไดนามิกเท่านั้นหรือexports_filter
ไม่ให้ตรวจจับเป้าหมายนี้
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
deps
|
ทรัพยากร Dependency ของไลบรารีทางอ้อมสําหรับ Deep Direct เหล่านี้จะลิงก์กับไลบรารีที่ใช้ร่วมกันนี้
ตราบใดที่ยังไม่มีการลิงก์โดย
ในระหว่างการวิเคราะห์ การใช้งานกฎจะถือว่าเป้าหมายใดก็ตามที่แสดงใน
การทําให้ใช้งานได้นี้ยังจะแสดงข้อผิดพลาดเมื่อใดก็ตามที่มีการเชื่อมโยงไลบรารีเดียวกันแบบคงที่ใน |
additional_linker_inputs
|
user_link_flags
|
dynamic_deps
|
cc_shared_library ที่เป้าหมายปัจจุบันใช้อยู่
การนํา |
exports_filter
|
ไลบรารีที่ใช้ร่วมกันจะส่งออกเป้าหมาย
โปรดทราบว่าจริงๆ แล้วแอตทริบิวต์นี้ไม่ได้เพิ่ม Edge Dependency ให้กับเป้าหมายเหล่านั้น แต่ อนุญาตให้ใช้ไวยากรณ์ต่อไปนี้
|
shared_lib_name
|
|
user_link_flags
|
cc_shared_library( name = "foo_shared", additional_linker_inputs = select({ "//src/conditions:linux": [ ":foo.lds", ":additional_script.txt", ], "//conditions:default": []}), user_link_flags = select({ "//src/conditions:linux": [ "-Wl,-rpath,kittens", "-Wl,--version-script=$(location :foo.lds)", "-Wl,--script=$(location :additional_script.txt)", ], "//conditions:default": []}), ... ) |
win_def_file
|
ควรใช้แอตทริบิวต์นี้เฉพาะเมื่อ Windows เป็นแพลตฟอร์มเป้าหมาย ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้ |
fdo_prefetch_hints
ดูแหล่งที่มาของกฎfdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)
แสดงโปรไฟล์คําแนะนําการโหลดล่วงหน้าของ FDO ที่อยู่ในพื้นที่ทํางานหรือในเส้นทางสัมบูรณ์ที่ระบุ ตัวอย่าง
fdo_prefetch_hints( name = "hints", profile = "//path/to/hints:profile.afdo", ) fdo_profile( name = "hints_abs", absolute_path_profile = "/absolute/path/profile.afdo", )
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
profile
|
|
โปรไฟล์ fdo
ดูแหล่งที่มาของกฎfdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)
แสดงโปรไฟล์ FDO ที่อยู่ในพื้นที่ทํางานหรือในเส้นทางสัมบูรณ์ที่ระบุ ตัวอย่าง
fdo_profile( name = "fdo", profile = "//path/to/fdo:profile.zip", ) fdo_profile( name = "fdo_abs", absolute_path_profile = "/absolute/path/profile.zip", )
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
absolute_path_profile
|
|
profile
|
|
proto_profile
|
|
ผู้เพิ่มประสิทธิภาพ
ดูแหล่งที่มาของกฎpropeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
แสดงโปรไฟล์การเพิ่มประสิทธิภาพ Propeller ในพื้นที่ทํางาน ตัวอย่าง:
propeller_optimize( name = "layout", cc_profile = "//path:cc_profile.txt", ld_profile = "//path:ld_profile.txt" ) propeller_optimize( name = "layout_absolute", absolute_cc_profile = "/absolute/cc_profile.txt", absolute_ld_profile = "/absolute/ld_profile.txt" )
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
ld_profile
|
|
สําเนาถึง
ดูแหล่งที่มาของกฎcc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
deps
|
โดยอาจเป็นเป้าหมาย |
srcs
|
ไฟล์ ระบบจะไม่รวบรวมไฟล์ ต้องระบุไฟล์ทั้งหมด หากชื่อของกฎอยู่ใน
ไฟล์
...และกฎที่สร้างไฟล์เหล่านั้น ส่วนขยายที่ต่างกันจะแสดงภาษาโปรแกรมที่แตกต่างกันตามระเบียบ Gcc |
additional_linker_inputs
|
เช่น สามารถระบุไฟล์ .res ของ Windows ที่คอมไพล์ที่นี่เพื่อฝังในเป้าหมายไบนารีได้ |
copts
|
ระบบจะเพิ่มสตริงแต่ละสตริงในแอตทริบิวต์นี้ตามลําดับที่กําหนดไปยัง
หากแพ็กเกจประกาศฟีเจอร์
|
defines
|
-D และเพิ่มลงในบรรทัดคําสั่งคอมไพล์ไปยังเป้าหมายนี้ รวมถึงทุกกฎที่ขึ้นอยู่กับโทเค็นดังกล่าว โปรดใช้ความระมัดระวังอย่างยิ่ง เพราะอาจมีผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มการกําหนดค่าลงใน local_defines แทน
|
includes
|
ขึ้นอยู่กับการใช้แทน "Makeตัวแปร"
แต่ละสตริงจะมี คุณต้องเพิ่มส่วนหัวใน src หรือ hdrs มิฉะนั้นส่วนหัวจะไม่พร้อมใช้งานสําหรับกฎที่อ้างอิงเมื่อการคอมไพล์แซนด์บ็อกซ์ (ค่าเริ่มต้น) |
linkopts
|
LINKOPTS ก่อนลิงก์เป้าหมายไบนารี
องค์ประกอบแต่ละรายการของรายการนี้ที่ไม่ได้ขึ้นต้นด้วย |
linkstatic
|
cc_binary และ cc_test ให้ลิงก์ไบนารีในโหมดคงที่ โปรดดู cc_library.linkstatic ด้านล่าง
โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดใช้สําหรับ
หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกให้เครื่องมือสร้างบิลด์ลิงก์ใน มีสามวิธีในการเชื่อมโยงไฟล์ปฏิบัติการ:
แอตทริบิวต์
หากเป็น |
local_defines
|
-D นําหน้าและเพิ่มไปยังบรรทัดคําสั่งคอมไพล์สําหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในทรัพยากรที่เชื่อมโยงกัน
|
malloc
|
โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ |
nocopts
|
COPTS ที่มีอยู่ก่อนแล้วที่ตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดเจนในแอตทริบิวต์ opts ของกฎ) ออกจาก COPTS เพื่อคอมไพล์กฎนี้
แอตทริบิวต์นี้แทบไม่จําเป็น
|
stamp
|
ไบนารีที่ประทับตราจะไม่ได้รับการสร้างใหม่ เว้นแต่ทรัพยากร Dependency จะเปลี่ยนแปลง |
win_def_file
|
ควรใช้แอตทริบิวต์นี้เฉพาะเมื่อ Windows เป็นแพลตฟอร์มเป้าหมาย ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้ |
cc_toolchain
ดูแหล่งที่มาของกฎcc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)
แสดงเครื่องมือห่วงโซ่ C++
กฎนี้มีหน้าที่ดังนี้
-
กําลังรวบรวมอาร์ติแฟกต์ทั้งหมดที่จําเป็นสําหรับการทํางานของ C++ ซึ่งดําเนินการโดยแอตทริบิวต์ เช่น
all_files
,compiler_files
,linker_files
หรือแอตทริบิวต์อื่นๆ ที่ลงท้ายด้วย_files
) ไฟล์เหล่านี้คือกลุ่มไฟล์ที่มักเรียกใช้ไฟล์ที่จําเป็นทั้งหมด -
กําลังสร้างบรรทัดคําสั่งที่ถูกต้องสําหรับการกระทํา C++ โดยใช้ผู้ให้บริการ
CcToolchainConfigInfo
(รายละเอียดด้านล่าง)
ใช้แอตทริบิวต์ toolchain_config
เพื่อกําหนดค่าเครื่องมือเชน C++
นอกจากนี้ โปรดดู
หน้า
นี้สําหรับเอกสารประกอบของเครื่องมือเชน C++ และเอกสารการเลือกเชนเครื่องมือต่างๆ อย่างละเอียด
ใช้ tags = ["manual"]
เพื่อป้องกันไม่ให้มีการสร้างและกําหนดค่าเชนเครื่องมือโดยไม่จําเป็นเมื่อเรียกใช้ bazel build //...
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
all_files
|
all_files เป็นซูเปอร์แอตทริบิวต์ของแอตทริบิวต์อื่นๆ ทั้งหมด (เช่น การคอมไพล์ linktamp ต้องมีทั้งไฟล์คอมไพล์และลิงก์ ดังนั้นจึงต้องใช้ all_files )
นี่คือสิ่งที่ |
ar_files
|
คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการเก็บถาวร |
as_files
|
คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการประกอบแอสเซท |
compiler
|
toolchain_identifier แทน ชื่อนี้จะเป็น Noop หลัง
การย้ายข้อมูล CROSSTOOL ไปยัง Starlark
และจะถูกนําออกโดย #7075
เมื่อตั้งค่าแล้ว ระบบจะใช้พารามิเตอร์ดังกล่าวในการเลือก crosstool_config.toolchain ซึ่งจะมีลําดับความสําคัญเหนือกว่าตัวเลือก --cpu Bazel |
compiler_files
|
|
compiler_files_without_includes
|
|
coverage_files
|
|
cpu
|
เมื่อตั้งค่าแล้ว ระบบจะใช้พารามิเตอร์ดังกล่าวในการเลือก crosstool_config.toolchain ซึ่งจะมีลําดับความสําคัญเหนือกว่าตัวเลือก --cpu Bazel |
dwp_files
|
|
dynamic_runtime_lib
|
ซึ่งจะใช้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเรากําลังลิงก์ทรัพยากร Dependency แบบไดนามิก |
exec_transition_for_inputs
|
|
libc_top
|
|
linker_files
|
|
module_map
|
|
objcopy_files
|
|
static_runtime_lib
|
ซึ่งจะใช้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเราจะลิงก์ทรัพยากร Dependency แบบคงที่แบบคงที่ |
strip_files
|
|
supports_header_parsing
|
|
supports_param_files
|
|
toolchain_config
|
cc_toolchain_config_info
|
toolchain_identifier
|
เราขอแนะนําให้เชื่อมโยง |
ชุดเครื่องมือ cc_toolchain
ดูแหล่งที่มาของกฎcc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงคอลเล็กชันของห่วงโซ่เครื่องมือ C++
กฎนี้มีหน้าที่ดังนี้
- การรวบรวมเชนเครื่องมือ C++ ที่เกี่ยวข้องทั้งหมด
-
เลือก 1 ห่วงโซ่โดยขึ้นอยู่กับตัวเลือก
--cpu
และ--compiler
ที่ส่งไปยัง Bazel
นอกจากนี้ โปรดดู หน้า นี้สําหรับเอกสารประกอบของเครื่องมือเชน C++ และเอกสารการเลือกเชนเครื่องมือต่างๆ อย่างละเอียด
อาร์กิวเมนต์
แอตทริบิวต์ | |
---|---|
name |
ชื่อที่ไม่ซ้ํากันสําหรับเป้าหมายนี้ |
toolchains
|
cc_toolchain ระบบจะใช้ "<cpu>" เมื่อส่งต่อเฉพาะ --cpu ไปยัง Bazel และจะใช้ "<cpu>|<คอมไพเลอร์>" เมื่อทั้ง --cpu และ --compiler ส่งผ่านไปยัง Bazel ตัวอย่าง:
cc_toolchain_suite( name = "toolchain", toolchains = { "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc", "piii": ":my_cc_toolchain_for_piii_using_default_compiler", }, ) |