Compiler error, "Unbalanced $(\$)"

Hello. I’m new to the forum, so I’m sorry if I’m posting this under the wrong category.

I’ve been working in a project using ESP32 and recently I’ve been unable to compile anything, even previous versions of the code that were know to work before.

The error shown when trying to compile is as follows:

*** [.pio\build\Wemos-Lolin32-Lite\firmware.elf] Unbalanced $(/$) in: xtensa-esp32-elf-g++ -o firmware.elf -mlongcalls -Wno-frame-address -Wl,--cref -Wl,--gc-sections -fno-rtti -fno-lto -Wl,--wrap=longjmp -Wl,--undefined=uxTopUsedPriority -T esp32.rom.redefined.ld -T memory.ld -T sections.ld -T esp32.rom.ld -T esp32.rom.api.ld -T esp32.rom.libgcc.ld -T esp32.rom.newlib-data.ld -T esp32.rom.syscalls.ld -T esp32.peripherals.ld -u ld_include_hli_vectors_bt -u _Z5setupv -u _Z4loopv -u esp_app_desc -u pthread_include_pthread_impl -u pthread_include_pthread_cond_impl -u pthread_include_pthread_local_storage_impl -u pthread_include_pthread_rwlock_impl -u include_esp_phy_override -u ld_include_highint_hdl -u start_app -u start_app_other_cores -u __ubsan_include -u __assert_func -u vfs_include_syscalls_impl -u app_main -u newlib_include_heap_impl -u newlib_include_syscalls_impl -u newlib_include_pthread_impl -u newlib_include_assert_impl -u __cxa_guard_dummy -Wl,-Map="D:\Users\USERNAME\Documents\ORGANIZATION\sensor\sensor\.pio\build\Wemos-Lolin32-Lite\firmware.map" -Og -g2 -ggdb2  InternetTime.cpp.o main.cpp.o sensor_webserver.cpp.o $( -L.pio\build\Wemos-Lolin32-Lite -LC:\Users\USERNAME\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\lib -LC:\Users\USERNAME\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\ld -LC:\Users\USERNAME\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\qspi_qspi $) -Wl,--start-group $(env.build_src_flags) libAdafruit Unified Sensor.a libDHT sensor library.a libEEPROM.a libNeoGPS.a libAsyncTCP.a libFS.a libWiFi.a libESP Async WebServer.a libWire.a libSPI.a libAdafruit BusIO.a libRTClib.a libPreferences.a libSPIFFS.a libWiFiClientSecure.a libHTTPClient.a libFrameworkArduinoVariant.a libFrameworkArduino.a -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lasio -lbt -lcbor -lunity -lcmock -lcoap -lnghttp -lesp-tls -lesp_adc_cal -lesp_hid -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lesp_lcd -lprotobuf-c -lprotocomm -lmdns -lesp_local_ctrl -lsdmmc -lesp_serial_slave_link -lesp_websocket_client -lexpat -lwear_levelling -lfatfs -lfreemodbus -ljsmn -ljson -llibsodium -lmqtt -lopenssl -lperfmon -lspiffs -lulp -lwifi_provisioning -lbutton -lrmaker_common -ljson_parser -ljson_generator -lesp_schedule -lesp_rainmaker -lqrcode -lws2812_led -lesp-dsp -lesp-sr -lesp32-camera -lesp_littlefs -lfb_gfx -lasio -lcbor -lcmock -lunity -lcoap -lesp_lcd -lesp_websocket_client -lexpat -lfreemodbus -ljsmn -llibsodium -lperfmon -lesp_adc_cal -lesp_hid -lfatfs -lwear_levelling -lopenssl -lesp_rainmaker -lesp_local_ctrl -lwifi_provisioning -lprotocomm -lbt -lbtdm_app -lprotobuf-c -lmdns -lrmaker_common -lmqtt -ljson_parser -ljson_generator -lesp_schedule -lqrcode -lcat_face_detect -lhuman_face_detect -lcolor_detect -lmfn -ldl -lwakenet -lmultinet -lesp_audio_processor -lesp_audio_front_end -lesp-sr -lwakenet -lmultinet -lesp_audio_processor -lesp_audio_front_end -ljson -lspiffs -ldl_lib -lc_speech_features -lhilexin_wn5 -lhilexin_wn5X2 -lhilexin_wn5X3 -lnihaoxiaozhi_wn5 -lnihaoxiaozhi_wn5X2 -lnihaoxiaozhi_wn5X3 -lnihaoxiaoxin_wn5X3 -lcustomized_word_wn5 -lmultinet2_ch -lesp_tts_chinese -lvoice_set_xiaole -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lesp_ringbuf -lefuse -lesp_ipc -ldriver -lesp_pm -lmbedtls -lapp_update -lbootloader_support -lspi_flash -lnvs_flash -lpthread -lesp_gdbstub -lespcoredump -lesp_phy -lesp_system -lesp_rom -lhal -lvfs -lesp_eth -ltcpip_adapter -lesp_netif -lesp_event -lwpa_supplicant -lesp_wifi -lconsole -llwip -llog -lheap -lsoc -lesp_hw_support -lxtensa -lesp_common -lesp_timer -lfreertos -lnewlib -lcxx -lapp_trace -lnghttp -lesp-tls -ltcp_transport -lesp_http_client -lesp_http_server -lesp_https_ota -lsdmmc -lesp_serial_slave_link -lulp -lmbedtls -lmbedcrypto -lmbedx509 -lcoexist -lcore -lespnow -lmesh -lnet80211 -lpp -lsmartconfig -lwapi -lphy -lrtc -lesp_phy -lphy -lrtc -lesp_phy -lphy -lrtc -lxt_hal -lm -lnewlib -lstdc++ -lpthread -lgcc -lcxx -lapp_trace -lgcov -lapp_trace -lgcov -lc -Wl,--end-group

I suspect this bit…

$( -L.pio\build\Wemos-Lolin32-Lite -LC:\Users\USERNAME\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\lib -LC:\Users\USERNAME\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\ld -LC:\Users\USERNAME\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\qspi_qspi $)

…is the one causing trouble, but I don’t really know if that’s it nor how to fix it if it is.

I’ve tried using git bisect to check if my code broke somewhere but every version fails to the same error, even if it did work a month ago.
I’ve also tried rolling back to PlatformIO Core 5.2.5 but I get a different keyword error (may have to test in a fresh environment). Updating to the dev channel with pio upgrade --dev didn’t solve it either.
Reinstalling PlatformIO and VSCode from scratch doesn’t work. This error also shows in another systems so it’s not related to my machine.

I’ve tried making a separate simple project and it compiles fine.

Here’s my platformio.ini file if that helps:

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env]
platform = espressif32
framework = arduino
monitor_speed = 115200
lib_deps = 
	adafruit/Adafruit Unified Sensor@^1.1.4
	adafruit/DHT sensor library@^1.4.3
	bblanchon/ArduinoJson@^6.19.1
	bblanchon/StreamUtils@^1.6.1
	slashdevin/NeoGPS@^4.2.9
	me-no-dev/AsyncTCP@^1.1.1
	me-no-dev/ESP Async WebServer@^1.2.3
	adafruit/RTClib@^2.0.2
build_src_flags = 
	-Wall
	-Wextra
monitor_filters = esp32_exception_decoder
board_build.partitions = no_ota.csv

[env:Wemos-Lolin32-Lite]
board = lolin32_lite
build_type = debug
build_src_flags = 
	$(env.build_src_flags)

	; I2C pins
	-D I2C_SDA=23
	-D I2C_SCL=19

	; RGB LED Status pins
	-D STATUS_LED_R=GPIO_NUM_13
	-D STATUS_LED_G=GPIO_NUM_12
	-D STATUS_LED_B=GPIO_NUM_14

	; DHT sensor pin
	-D DHTPIN=32

	; Voltage reading pin
	-D VOLTAGE_PIN=35

	; GPS module pins
	-D GPS_SERIAL_RX=16
	-D GPS_SERIAL_TX=17
	-D GPS_ENERGY_PIN=GPIO_NUM_33

	; Interrupts pins
	-D WAKEUP_PIN_RTC=GPIO_NUM_34
	-D WAKEUP_PIN_CONFIG=GPIO_NUM_25
	-D WAKEUP_PIN_CONFIG_NUM=25

	; Inverse voltage divider
	-D BATTERY_VOLT_DIV=(2680.0/680.0)

	; Probe pin
	-D PROBE_PIN=GPIO_NUM_18

I don’t know if my code or an update is to blame, but I haven’t seen any other post referencing this Unbalanced "$(/$) and this has driven the project to a halt.

Thanks in advance.

Should this not be ${env.build_build_flags}?

2 Likes

Maybe remove () here too or precmpute the result

Has it always used ${} instead of $()? I’m surprised it even worked before.

This was it! Thank you!

About the flag, it’s this one
https://docs.platformio.org/en/stable/projectconf/section_env_build.html#build-src-flags

Always. I don’t understand how did it work before :frowning: